美文网首页程序员
Sherlock and Divisors

Sherlock and Divisors

作者: waaagh | 来源:发表于2020-05-17 01:32 被阅读0次

题目大意: 给定一个数N,求N的因子中能被2整除的个数。
算法: 循环1N,找出每个因子看是否能被整除,复杂度O(N),超时!想到若a为因子,则N/a也是因子,所以循环1sqrt(N)即可,注意当ii=N时不要重复加。
还有个方法,不过至少是O(N/2),对于偶数N=2
K,肯定有个因子K,假设K=p1e1p2e2...pmem,则N的因子中能被2整除的个数=K因子的排列组合=(e1+1)(e2+1)...*(em+1)。 +1是因为因子可以没有。
反思:思考再仔细些,尤其rainy case。
代码:

#include <bits/stdc++.h>
using namespace std;

int solve(int n) {
    int ret = 1;
    int p, e;
    if(n%2==0) {
        n /= 2;
        p = 2;
        while(p<=n) {
            if(p*p>n) p = n;
            e = 0;
            while(n%p==0) {
                ++e;
                n/=p;
            }
            ret *= e+1;
            ++p;
        }
    }
    return ret;

}
int main()
{
    int t, n;
    cin>>t;
    while(t--) {
        cin >> n;
        if(n%2) {
            cout << 0 << endl;
           continue;
        }
        int cnt = 0;
        int i;
        for(i=1; i*i<n; i++) {
            if(n%i==0) {
                if(i%2==0) ++cnt;
                if((n/i)%2==0) ++cnt;
            }
        }
        if(i*i==n&&i%2==0) ++cnt;
        cout << cnt << endl;
        //cout << solve(n) << endl;
    }
    return 0;
}

相关文章

网友评论

    本文标题:Sherlock and Divisors

    本文链接:https://www.haomeiwen.com/subject/zzjdohtx.html