你是天才

不我不是

  告诉你一个数的所有约数(包括1和该数本身)的和,以及约数的倒数之和,你能推出这个数是多少吗?

  如果你能知道,那你就是天才了。

  包含多组数据。  每组数据有三个正整数,A,B1和B2(1<=A,B1,B2<=10^9),其中A为C的约数和,而对于C的所有约数的倒数之和B,为避免精度误差,以分数B1/B2的形式给出。  输入文件以一行“0 0 0”结束。

解题思路

  首先,约数倒数和为1/a1+1/a2...1+/an此时我们将它通分为an/n+a/n+...a1/n,这是由于乘法的对称性以及他们都是n的约数,所以说n为他们的最小公倍数。

  然后提一个1/n出来,原式为1/n(a1+a2..+an),后面一段题目给了。所以用和÷倒数和=n

  注意一下还要返回去算是否合法

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long read(){
    long long res=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        res=res*10+(ch-'0');
        ch=getchar();
    }
    return res*f;
}
#define ll long long
ll k,a,b1,b2,ans;
bool check(int x,int y){
    int tot=0;
    for(int i=1;i*i<=x;++i){
        if(x%i==0){
            tot+=i;
            if(i!=x/i){
                tot+=(x/i);
            }
        }
    }
    if(tot==y)return 0;
    else return 1;
}
int main(){
while(1){
    a=read();b1=read();b2=read();
    if(a==0&&b1==0&&b2==0)break;
    ans=a*b2/b1;
    if(ans*b1!=a*b2)cout<<0<<endl;
    else if(1.0*b1/b2<1.0)cout<<0<<endl;
    else if(check(ans,a))cout<<0<<endl;
    else{
        cout<<1<<" "<<ans<<endl;
    }
}
return 0;
}
View Code
12-25 21:38