【洛谷】P1445 没占到1444的愤怒

继续洛谷刷水日常,突然遇到一道不是很水的题目……

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 }
上一篇:Android 屏幕截图(底层实现方式)


下一篇:An internal error occurred during: "Launching New_configuration"