不知道为什么会错
/* 求出 lcm(i,j)==n 的对数, 分解质因数,p1^e1 * p2^e2 * p3^e3 那么 i,j中必定有一个数有e1个p1因子,另一个任意即可 那么最终的结果就是 */ #include<bits/stdc++.h> using namespace std; #define maxn 10000005 #define ll long long ll n; int v[maxn]; int prime[maxn],m; void init(){ memset(v,0,sizeof v); memset(prime,0,sizeof prime); m=0; for(int i=2;i<maxn;i++){ if(v[i]==0){ v[i]=i; prime[++m]=i; } for(int j=1;j<=m;j++){ if(prime[j]>v[i] || prime[j]*i>n) break; v[i*prime[j]]=prime[j]; } } } int p[maxn],c[maxn],mm; void divide(ll n){ memset(p,0,sizeof p); memset(c,0,sizeof c); mm=0; for(int i=1;i<=m;i++){ if(prime[i]>n)break; if(n%prime[i]==0){ p[++mm]=prime[i],c[mm]=0; while(n%prime[i]==0)n/=prime[i],c[mm]++; } } if(n>1)p[++mm]=n,c[mm]=1; } int main(){ init(); int T; cin>>T; for(int tt=1;tt<=T;tt++){ cin>>n; divide(n); ll res=1; for(int i=1;i<=mm;i++) res*=(ll)(2*c[i]+1); printf("Case %d: %lld ",tt,res+1>>1); } }
这是网上的ac代码
#include <iostream> #include <cstdio> #include <map> #include <cmath> #include <map> #include <vector> #include <algorithm> #include <cstring> #include <string> using namespace std; #define LL long long #define maxn 10000001 bool v[maxn]; vector<int>prime; void p(){ memset(v,false,sizeof(v)); for(int i=2;i<=maxn;i++){ if(v[i])continue; for(int j=i+i;j<=maxn;j+=i){ v[j]=true; } if(!v[i]) prime.push_back(i); } } int main() { int t,ca=1; LL n,ans; p(); scanf("%d",&t); while(t--){ ans=1; scanf("%lld",&n); for(int i=0;i<prime.size()&&n>1;i++){ if(n%prime[i]==0){ LL s=0; while(n%prime[i]==0){ s++; n/=prime[i]; } ans*=(s*2+1); } } if(n>1){ ans*=3; } printf("Case %d: %lld ",ca++,(ans+1)/2); } return 0; }