链接
解法:素数筛完后,n素数因子分解
然后GCD LCM 的公式:
也就是说 LCM(i,j)=n, 则 i 或 j 的素数指数ai,bi中的最大值,必须为满足n 的素数因子指数大小ei
而其组合数每个素数的组合数为 2*(ei+1)-1 , 其中减一是出现了两次同时为ei
每个组合连乘则得到ans,所有LCM(i,j) =n 的组合数
但是题目要求是 i<=j ,则需要去重
满足i==j&&LCM(i,j) =n 的情况只能是 i=n,j=n ,因为 LCM(a,a)总等于a。
ans 中 LCM(a,b) =n LCM(b,a)= n 各算了两次 ,设这种情况数为num,则ans=num*2+1;
而题目求的答案为num+1 = ans/2+1
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e7+5; bool mark[N]; int prim[666666]; int cnt; void initial() { cnt=0; for (int i=2 ; i<N ; ++i) { if (!mark[i]) prim[cnt++]=i; for (int j=0 ; j<cnt && i*prim[j]<N ; ++j) { mark[i*prim[j]]=1; if (!(i%prim[j])) break; } } } int T; ll n; int main() { initial(); scanf("%d",&T); int tt=1; while(T--) { scanf("%lld",&n); ll ans=1; for(int i=0;i<cnt;i++) { ll num=0; while(n%prim[i]==0) { n/=prim[i]; num++; } if(num) { ans*=2*(num+1)-1; } } if(n>1) ans*=2*(2)-1; printf("Case %d: %lld\n",tt++,ans/2+1); } }
Pairs Forming LCM 唯一分解定理+组合数
最新推荐文章于 2020-12-20 22:02:38 发布