七夕节(筛法思想)

Description

 

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

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

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

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

 

Sample Input

 

3
2
10
20

Sample Output

1
8
22


解题思路:题目要求所给数的所有因子之和。这道题如果针对每一个数都将其拆分成一个个的因子,必然会造成时间超时,要解决这个问题,我们需要考虑找每个数的因子有没有什么共性的方法,这样就可以通过打表实现了!是有的,每个数可能会很大,但其因子必然会小于其本身,而它的因子还有可能是其他数的因子,那么我们直接去枚举因子边可以了。而因子该怎么分配给含有该因子的数呢?是该因子的倍数的那些数必然含有该因子!我们直接分配给它的倍数就可以了,这里其实也是筛法的一种应用,代码和筛法求素数有点像。
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define MAX 500010
 5 using namespace std;
 6 int a[MAX];
 7 void getsum()
 8 {
 9     int i,j;
10     for(i=1;i<=MAX;i++)
11     {
12         for(j=i*2;j<MAX;j+=i)
13         {
14             a[j]=a[j]+i;
15         }
16     }
17 }
18 int main()
19 {
20     int t,n;
21     scanf("%d",&t);
22     getsum();
23     while(t--)
24     {
25         scanf("%d",&n);
26         printf("%d\n",a[n]);
27     }
28     return 0;
29 }

 

 




posted @ 2018-11-06 15:34  王陸  阅读(353)  评论(0编辑  收藏  举报