七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:
数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.
你想知道你的另一半吗?
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:
数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.
你想知道你的另一半吗?
Input
输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000).
Output
对于每组测试数据,请输出一个代表输入数据N的另一半的编号.
Sample Input
3 2 10 20
Sample Output
1 8 22
// 注意T和N的取值范围,直接遍历求因子和计算量过大
1 #include<stdio.h> 2 int main() 3 { 4 int t, n, sum, i; 5 scanf("%d", &t); 6 while(t--) 7 { 8 scanf("%d", &n); 9 sum=0; 10 for(i=1;i<n;i++) 11 if(n%i==0) 12 sum+=i; 13 printf("%d ", sum); 14 } 15 return 0; 16 }
// 取一半遍历还是太大
1 #include<stdio.h> 2 int main() 3 { 4 int t, n, sum, i; 5 scanf("%d", &t); 6 while(t--) 7 { 8 scanf("%d", &n); 9 sum=1; 10 for(i=2;i<=n/2;i++) 11 if(n%i==0) 12 sum+=i; 13 printf("%d ", sum); 14 } 15 return 0; 16 }
// 用了打表,但是求因子和的算法未变
1 #include<stdio.h> 2 int soulm[500001]; 3 int main() 4 { 5 for(int j=1;j<=500000;j++) 6 { 7 int sum=1; 8 for(int i=2;i<=j/2;i++) if(j%i==0) sum+=i; 9 soulm[j]=sum; 10 } 11 int t, n; 12 scanf("%d", &t); 13 while(t--) 14 { 15 scanf("%d", &n); 16 printf("%d ", soulm[n]); 17 } 18 return 0; 19 }
// i和j表示因子,其中j又代表不超过N的正整数.
// 减少了调用因子的次数,用循环控制积
// 注意表中的和包含了N,输出时要减去
1 #include<stdio.h> 2 int soulm[500001]; 3 int main() 4 { 5 for(int j=1;j<=500000;j++) 6 for(int i=1;i*j<=500000;i++) 7 soulm[i*j]+=i; 8 int t, n; 9 scanf("%d", &t); 10 while(t--) 11 { 12 scanf("%d", &n); 13 printf("%d ", soulm[n]-n); 14 } 15 return 0; 16 }