洛谷P1445
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷P1445相关的知识,希望对你有一定的参考价值。
继续洛谷刷水日常,突然遇到一道不是很水的题目……
https://www.luogu.org/problem/show?pid=1445
题意:给定n(1<=n<=1000000),求方程1/x+1/y=1/n!的正整数解的个数。
思考了5min后,就去看题解了……
Qrc:这也太弱了……
【思路】
原方程可变形为:
xy/(x+y)=n!
xy-(x+y)n!=0,配方后,得:
(x-n!)(y-n!)=(n!)^2
所以求出(n!)^2的因数个数即可,又由于因数定理(正整数的因数个数等于其所有质因数幂次+1的乘积),只要求出其质因数及幂次即可
又:(n!)^2的每个质因数的幂次都是n!的质因数的2倍
同理,n!的质因数幂次是1~n每个数质因数幂次的“和”
所以对1~n中所有数求出质因数及幂次即可
先筛出1~n中所有的质数
再对每一个质数判断,1~n中,它作为质因数出现了几次?
下面贴上代码:
1 #include<cstdio> 2 const int M=1e9+7; 3 int n,primes[5000001],num=0,Ans=1; 4 bool isntprime[10000001]={1,1}; 5 void prime1(){//线性筛法 6 for(int i=2;i<=n;++i){ 7 if(!isntprime[i])primes[++num]=i; 8 for(int j=1;j<=num&&i*primes[j]<=n;++j){ 9 isntprime[i*primes[j]]=1; 10 if(!(i%primes[j]))break; 11 } 12 } 13 } 14 int main(){ 15 scanf("%d",&n); 16 prime1(); 17 for(int i=1;i<=num;++i){ 18 int prime=primes[i],c=0; 19 for(long long j=prime;j<=n;j*=prime) 20 c+=n/j;//必须对prime的若干次幂都进行一遍,这样不会漏掉包含其多次幂的数 21 Ans=1ll*Ans*(c*2+1)%M; 22 } 23 printf("%d",Ans); 24 return 0; 25 }
以上是关于洛谷P1445的主要内容,如果未能解决你的问题,请参考以下文章