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

 

posted @ 2017-11-05 11:50  鲸头鹳  阅读(188)  评论(0编辑  收藏  举报