七夕节

来源:互联网 发布:sql存储过程打印参数 编辑:程序博客网 时间:2024/04/28 17:55

七夕节

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 35175    Accepted Submission(s): 11012


Problem Description
七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:



数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.
你想知道你的另一半吗?
 

Input
输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000).
 

Output
对于每组测试数据,请输出一个代表输入数据N的另一半的编号.
 

Sample Input
321020
 

Sample Output
1822
 

Author
Ignatius.L
思路:参考博客http://www.cnblogs.com/kuangbin/archive/2011/07/23/2114997.html 两个方法~写的很好
大众思路肯定是超时的了。我开始就超时了。可以改善一下,算到算数平方根就停止。
#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>using namespace std;int main(){    int T,a,i,sum,t;    cin>>T;    while(T--)    {        sum=1;        cin>>a;        t=sqrt(a);        for(i=2;i<=t;i++)        {            if(a%i==0)              {                sum+=i;                if(i!=a/i)                sum+=a/i;              }        }        cout<<sum<<endl;    }}

还有一个打表的方法,我直接从大神上面粘来了:
#include<stdio.h>#include<iostream>using namespace std;const int MAXN=500000;int f[MAXN+1];void vext(){    int i,j;    f[0]=f[1]=0;    for(i=1;i<=MAXN/2;i++)       for(j=i*2;j<=MAXN;j+=i)         f[j]+=i;}int main(){    int T;    int n;    cin>>T;    vext();    while(T--)    {        scanf("%d",&n);        printf("%d\n",f[n]);    }     return 0;   }
0 0