JZYZOJ1379天才的约数和 数论 约数和

Posted 鲸头鹳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JZYZOJ1379天才的约数和 数论 约数和相关的知识,希望对你有一定的参考价值。

http://172.20.6.3/Problem_Show.asp?id=1379

 
易得n=a*b2/b1;
需要注意算出n之后要判断n的约数和是否等于a,这里需要用约数和定理递归,递归前求一下约数,避免数字太大浪费时间,这种数字即使是n的复杂度也承受不起吧括弧笑,相比之下sqrt(n)就好很多了。
 
代码
技术分享
 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring>  
 4 #include<algorithm>  
 5 #include<cmath>  
 6 using namespace std;
 7 const int maxn=50100;
 8 long long a,b1,b2,tot,tot1;
 9 long long q[maxn]={};
10 long long su[maxn]={};
11 long long dfs(long long x,long long i){
12     i+=1;long long y;
13     for(;;i++){
14         y=q[i];
15         if(x%y==0){
16             long long ans=1,k=1;
17             while(x%y==0){
18                 x/=y,k*=y,ans+=k;
19             }
20             if(x==1)return ans;
21             return ans*dfs(x,i);
22         }
23     }
24 }
25 bool doit(long long x){
26     if(a==1&&x==1)return 1;
27     tot1=0;long long ma=(long long)sqrt(double(x));
28     for(int i=1;i<=ma;i++){
29         if(x%i==0){
30             q[++tot1]=i;q[++tot1]=x/i;
31         }
32     }sort(q+1,q+tot1+1);
33     if(dfs(x,1)==a)return 1;
34     return 0;
35 }
36 int main(){
37     while(~scanf("%I64d%I64d%I64d",&a,&b1,&b2)){
38         if(a==0&&b1==0&&b2==0){break;}
39         long long w=a*b2;
40         if(w%b1==0){
41             if(doit(w/b1))printf("%d %I64d\n",1,w/b1);
42             else printf("%d\n",0);
43         }
44         else printf("%d\n",0);
45     }
46     return 0;
47 }
View Code

 

以上是关于JZYZOJ1379天才的约数和 数论 约数和的主要内容,如果未能解决你的问题,请参考以下文章

51nod 约数和(数论)

B1968 [Ahoi2005]COMMON 约数研究 数论

数论相关内容总结——质数和约数

PASS486|数论|约数|枚举

POJ 1845-Sumdiv 题解(数论,约数和公式,逆元,高中数学)

求约数个数的和