LightOJ 1236 Pairs Forming LCM
2015-10-01 17:43
543 查看
题意:
求小于n的数中lcm(i,j)==n的所有(i,j)数对有多少组。思路:
唯一分解定理,真的不好想。首先由唯一分解定理n是由所有ai素因子的bi次幂的乘积组成,两个数的lcm为n那么这两个数对于每一个素因子ai都一定有至少在其中一个数中包含全部ai的bi次幂,并且两个数都不超过bi次幂也不包含其他素因子,如此才能保证相乘之后消去共同素因子还能剩下n的素因子。
然后求解总数,对于每个ai都有当第一个数包含全部的bi个ai时第二个数可以包含0~bi个,同理当第二个数包含bi个时第一个数可以包含0~bi个,sum*=(2*(bi+1))这样两个数都包含bi个ai的情况就算了两次,所以应该是sum*=(2*bi+1);然后因为上限为1e14必然打表素数只能打到1e7也就是可以扫到sqrt(n)的位置,之后可能还有一个大素数因子,但是因为大于sqrt(n)所以必然只可能有一个,只要唯一分解定理判断完之后如果未除到1的话再算一个bi=1的情况就行了。然后因为是求数对数,所以要除以二。
代码:
#define N 11234567 long long n,m; long long flag,sum,ave,ans,res,len,ans1,ans2; bool mark ; int pri[N/10],cnt; void SP() { cnt=0; memset(mark,true,sizeof(mark)); mark[0]=mark[1]=false; for(int i=2;i<N;i++) { if(mark[i]) pri[cnt++]=i; for (int j=0;(j<cnt)&&(i*pri[j]<N);j++) { mark[i*pri[j]]=false; if (i%pri[j]==0) break; } } } long long getFactor(long long x) { long long sum=1; for(int i=0;i<cnt&&pri[i]*pri[i]<=x;i++) { long long res=0; while(x%pri[i]==0&&x)x/=pri[i],res++; sum*=(2*res+1); } if(x>1)sum*=3; sum/=2;sum++; return sum; } int main() { int i,j,k,kk,t,x,y,z; SP(); scanf("%d",&k); kk=0; while(k--) { scanf("%lld",&n); printf("Case %d: %lld\n",++kk,getFactor(n)); } return 0; }
相关文章推荐
- Aizu 2300 Calender Colors(暴力)
- Aizu 2301 Sleeping Time(概率,剪枝)
- Aizu 2303 Marathon Match (概率)
- org.hibernate.LazyInitializationException: failed to lazily initialize no session or session was clo
- raid各级别特性
- LightOJ 1282 Leading and Trailing
- root@kali:~# insmod /usb/serial/cp210x.ko :Unknown symbol in module
- 1014. Waiting in Line (30) 模拟银行排队
- JMeter一个错误the target server failed to respond--JMeter坑
- Service Manager流程,派BC_REPLY,唤醒FregServer流程,返回BR_TRANSACTION_COMPLETE,睡眠等待proc->wait
- POJ 3735:Training little cats 联想到矩阵相乘
- POJ 3735:Training little cats 联想到矩阵相乘
- LeetCode——Submission Details
- D-S证据理论学习笔记(二)
- RAID的个级别特性
- SURF项目总结 - deepdream
- ArrayList的contains方法,底层调用了equals方法
- /dev/sr0光驱挂载引起的CPU io_wait升高一“血案”
- /dev/sr0光驱挂载引起的CPU io_wait升高一“血案”
- pip fail with bad md5 hash for package?解决方案(Mac OS 10.10.4)