LightOJ 1236
来源:互联网 发布:苹果手机搞怪软件 编辑:程序博客网 时间:2024/06/06 10:02
题目描述:
点击打开链接
分析题目,在n以内找i,j两数使lcm(i,j)=n,那么i,j必然是n的约数,将n质因子分解成n=p1^e1*p2^e2*....pn^an;则i,j也必然可以分解成这种形式;i=p1^i1*p2^i2....pn^in,j=p1^j1*p2^j2....pn^jn;对于任意的i,j对于所有数的指数满足ex=max(ix,jx),此时lcm(i,j)=n,那么符合lcm(i,j)=n的情况我们就只需要分析n的质因子组成就够了,对于p1,如果让i1=e1的话对于j1就可以选择0-e1中的(e1+1)个数,对于j1=e1时i1也有(e1+1)种选法,这其中i1=j1=e1的方案被选择两次,所以对于p1的选择方案就有2*(e1+1)-1=2*e1+1种,将p的结果累乘起来就是总方案数,但是这方案中对于同样的(i,j)组合,(i,j)和(j,i)是被计算了两次的,而按照题目描述这种情况是只计算一次的,所以最后的结果要除以2。
AC代码:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<string>#include<stack>#include<queue>#include<algorithm>#include<map>using namespace std;const int INF=0x3f3f3f3f;const int MAXM=10000010;long long n;bool prime[MAXM+10];long long rec[MAXM/10], cnt;void init_prime_table(){ memset(prime,true,sizeof(prime)); cnt=0; prime[0]=prime[1]=false; for (long long i = 2; i<=MAXM; ++i) { if (prime[i]) rec[cnt++] = i; for (long long j =0;j<cnt&&rec[j]<=MAXM/i;++j) { prime[i*rec[j]]=false; if (i%rec[j]==0) break; } }}int main(){ int T; scanf("%d",&T); int p=1; init_prime_table(); while(T--) { scanf("%lld",&n); long long ans=1; for (int i=0;i<cnt;i++) { if (rec[i]*rec[i]>n) break; int e=0; if (n%rec[i]==0) { while(n%rec[i]==0) { n=n/rec[i]; e++; } ans*=(2*e+1); } } if (n>1) ans*=(2*1+1); //printf("%I64d\n",ans); printf("Case %d: %lld\n",p,ans/2+1); p++; } return 0;}
阅读全文
0 0
- LightOJ 1236
- LightOJ-1236
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- [LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- const和define
- codeforces D.The Bakery
- 【备忘】大数据最火爆技术spark之王家林2016最新高清视频教程
- Web报表系统葡萄城报表:数据可视化分析
- 《双抢》
- LightOJ 1236
- 消除SVN checkout到桌面导致桌面文件一大堆问号
- 64k方法数限制原理与解决Android5.0之前的版本分包报错发现的
- 转载----在sklearn上使用集成算法
- JAVA中的finally及异常丢失问题
- 微信小程序教程系列
- String 类入门
- 九九乘法表
- c#中配置文件的使用(二)