long long pairsFormLCM( int n ) {
long long res = 0;
for( int i = 1; i <= n; i++ )
for( int j = i; j <= n; j++ )
if( lcm(i, j) == n ) res++; // lcm means least common multiple
return res;
}
给n求, 上述代码的结果。
分析:从算术基本定理来考虑。
代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 1e7+11;
const int M = 1e6+11;
const int mod = 1e9+7;
const int inf = 0x3f3f3f3;
bool su[N+1]={1,1,0};int prm[M],sz=0;
void init(){
for(int i=2;i<N;i++){
if(!su[i]) prm[sz++]=i;
for(int j=0;j<sz;j++){
LL t=prm[j]*i;
if(t>N) break;
su[t]=1;
if(i%prm[j]==0) break;
}
}
// cout<<sz;
}
LL solve(LL n){
if(n==1) return 1;
LL ans=1; int cnt=0;
for(int i=0;i<sz && prm[i]*1ll*prm[i]<=n;i++){
if(n%prm[i]==0){
int ge=0; cnt++;
while(n%prm[i]==0) { ge++; n/=prm[i];}
ans=ans*(2*ge+1);
}
if(n==1) break;
}
if(n!=1) ans=ans*(2*1+1);
ans++;
return ans/2;
}
int main(){
init();
int t;scanf("%d",&t);
int cas=1;
while(t--){
LL n;scanf("%lld",&n);
printf("Case %d: %lld\n",cas++,solve(n));
}
return 0;
}