哇这题坑是真的多,虽然很警惕还是交了三次。
以前没好好看题还以为超级超级难,就一直没做。今天写了一下觉得就还好,思路好想,不被坑难。
一句话题意:找到大于等于n的约数和的约数和等于自己的第一个数,输出它和它的约数和。
看到s<=18000就可以上一个暴力,枚举每个因数i,i的倍数的那些数的sum[k*i]+=i就好了,复杂度还说的过去。
那么我菜在哪呢?首先
忽略那些自己是自己的“非常好友”的情况
这句话没写上去,10分没了。
然后虽然n<=18000但是答案一定比18000大,然而我只处理到了18000,还怪蠢了。偷偷看了一眼数据,发现处理到20000就好了。
而且sum[i*k]也是有可能很大的,再拿着sum[sum[i*k]]去比较就会越界了。
最后还是交了三遍才过。
真是菜啊。
复杂度是O(跑得过)
int i,f; int n; int o[20010]; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("123.in","r",stdin); //freopen("123.out","w",stdout); cin>>n; for(i=1;i<=10000;i++) for(f=2*i;f<=20000;f+=i) o[f]+=i; for(i=n;;i++) { if(o[i]>=20000) continue; if(i==o[o[i]]&&i!=o[i]) { cout<<i<<' '<<o[i]; return 0; } } }