/****************************8
这题暴力肯定要超时,换一种思路,把一个数变化成素因子相乘的形式
那么a=p1^e1*p2^e2...pn^en
所有除a以外的因子之和=(p1^0+p1^1+..p1^e1)*(p2^0+p2^1+...)...*(pn^0+pn^1+...pn^en)-p1^e1*p2^e2*...pn^en
然后就出来了。。。我摔,刚才发现p1^e1*p2^e2*...pn^en不需要求了直接就是a了= =
代码就这样吧
ps..之前图方便用pow函数,,结果就各种不对,后来百度才发现pow的参数类型= =好吧没见有int int的
*****************************/
七夕节
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24817 Accepted Submission(s): 7686
Problem Description
七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:
数字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
# include<stdio.h>
# include<math.h>
const int maxn=500005;
bool isPrime[maxn]={0};
int prime[maxn/10], num=0;
void getPrime(int n) //筛素数,并把素数存到prime数组里
{
int t;
for(int i=2; i<=n; i++)
{
if(isPrime[i]==0)
{
prime[num++] = i;
for(int j=2; (t=j*i)<=n; j++)
isPrime[t]=1;
}
}
}
int main(void)
{
getPrime(maxn-1);
int t,i,j,a, cnt, n, temp, p, k, tmp;
scanf("%d", &t);
while(t--)
{
n=0;
p=1;
k=1;
scanf("%d", &a);
for(i=0; ; i++)
{
temp=0;
cnt=0;
if(a==1)
break;
while(a%prime[i]==0)
{
temp=1;
a=a/prime[i];
cnt++;
}
if(temp)
{
tmp=1;
for(j=0; j<cnt; j++)
p*=prime[i];
for(j=0; j<=cnt; j++)
tmp*=prime[i];
k*=(tmp-1)/(prime[i]-1);
}
}
printf("%d\n", k-p);
}
return 0;
}