七夕节
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 45645 Accepted Submission(s): 14541
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
算数基本定理的简单应用
1)求标准分解式
2)套公式求解。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define _m 200000
//素因子分解 的零件
int p[_m], a[_m];//p 因子, a 指数
//素因子分解函数
int Getfactor (int x)
{
//now 当前剩余, cnt 已有素因子个数
int now = x, cnt = 0;
//找素因子
for(int i=2; i <= x/i; i++)
{
//是素因子
if(now % i == 0)
{
p[ ++cnt ] = i;
a[cnt] = 0;
while(now % i == 0)//把这个因子找光
{
a[cnt] ++;
now /= i;
}
}
}
//除完之后不等于1,now也是一个素因子
if(now != 1)
{
p[ ++cnt ] = now;
a[cnt] = 1;
}
return cnt;//返回素因子个数
}
//求 qi 的 0次方 一直加到 ai次方 的和
int Getsum (int x)
{
int sum = 1, xx = 1;
for(int i=1; i<=a[x]; i++)
{
xx *= p[x];
sum += xx;
}
return sum;
}
int main ()
{
int cas, x;
scanf("%d", &cas);
while( cas-- )
{
scanf("%d", &x);
int cnt = Getfactor(x);//素因子分解
//求因子和
int ans = 1;
for(int i=1; i<=cnt; i++)
ans *= Getsum(i);//(2)中那个函数就是这一句。。。
printf("%d\n", ans-x);//题目要求不包含x本身
}
return 0;
}