基本算数定理快速求约数个数——lightoj1208

it2022-05-05  83

#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); } }

 

转载于:https://www.cnblogs.com/zsben991126/p/11130623.html


最新回复(0)