Basic arithmetic Theorem quickly find the number of submultiple --lightoj1208

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 1000005

bool vis[maxn];
int m,primes[maxn];
void init(){
    for(int i=2;i<maxn;i++){
        if(!vis[i])
            primes[++m]=i;
        for(int j=1;j<=m;j++){
            if(primes[j]*i>=maxn)break;
            vis[primes[j]*i]=1;
            if(i%primes[j]==0)break;
        }
    }
}

/*基本算数定理*/ 
ll calc(ll n){
    ll res=1;
    for(int i=1;i<=m && primes[i]*primes[i]<=n;i++)
        if(n%primes[i]==0){
            ll cnt=1;
            while(n%primes[i]==0)
                ++cnt,n/=primes[i];
            res*=cnt;
        }
    if(n>1)res=res*2;
    return res;
}

int main(){
    init();
    int t;cin>>t;
    for(int tt=1;tt<=t;tt++){
        ll n;
        scanf("%lld",&n);
        printf("Case %d: %lld\n",tt,calc(n)-1);
    } 
}

 

Guess you like

Origin www.cnblogs.com/zsben991126/p/11130623.html