七夕节




Problem Description

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

HDU-1215-七夕节


数字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

//暴力会超时,所以要缩短时间,这种思想很常用,一个等式,由未知量x1 ○ x2=结果y。如果要找x1和x2但知道结果,如果遍历x1和x2,那么需要双重循环,太费时,现在就是用结果y和其中一个变量x1求另一个变量x2,只需遍历x1这一个就行,就只需一个循环,判断x2是否符合要求即可。
#include <bits/stdc++.h> using namespace std; #define N 500001 int prime[N]; int main() { int i,j; prime[0]=0; prime[1]=1; prime[2]=1;//筛选法求素数 for(i=3;i<N;i++) { if(i%2) prime[i]=1; else prime[i]=0; } for(i=3;i<=sqrt(N);i++) { if(prime[i]) for(j=i+i;j<N;j=j+i) prime[j]=0; } int t,n,sum; scanf("%d",&t); while(t--) { scanf("%d",&n); if(prime[n]==1) printf("1\n"); else { sum=1; for(int i=2;i*i<=n;i++) { if(n%i==0&&i*i!=n) sum=sum+i+n/i; if(i*i==n) { sum=sum+i; } } printf("%d\n",sum); } } return 0; }

相关文章: