http://acm.hdu.edu.cn/showproblem.php?pid=1215
题目大意:
找对象的题。。。汗。。将你的编号(唯一)的所有因子加起来,所得到的的另一个编号的主人就是你的另一半。给出你的编号,要求找到你的对象的编号。
一开始直接模拟TLE。
然后后来看到别人是这么做的:
#include<cstdio> #include<string> int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); int cur=2; int ans=1; for(int i=2;(i>>1)<=n;i++) //将问题规模减半 { if(n%i==0) { if(n/i > i) //如果把不等于i,那么说明i和n/i都是因子 ans+=n/i+i; else if(n/i==i) //等于i就一个因子 ans+=i; else //如果n/i<i说明因子算完了。。 break; } } printf("%d\n",ans); } return 0; }
后来采用类似筛选素数的方法,打表。
我们先将2的倍数的都+上2.。。3的倍数都加上3、。。。。
要注意的是如果n==1的时候答案为0.
#include<cstdio> const int MAXN=500000+1; const int N=250000; int ans[MAXN]={0}; int main() { for(int i=2;i<MAXN;i++) for(int j=i+i;j<MAXN;j+=i) ans[j]+=i; ans[1]=-1; int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); printf("%d\n",ans[n]+1); } return 0; }