HDU 1215 七夕节

来源:互联网 发布:淘宝自动上下架软件 编辑:程序博客网 时间:2024/05/22 02:03

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1215


七夕节

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 40476    Accepted Submission(s): 12726


Problem Description

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



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

Input

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

Output

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

Sample Input

321020
 

Sample Output

1822
 

Author

Ignatius.L
 

Source

杭电ACM省赛集训队选拔赛之热身赛
 

Recommend

Eddy

思路:求因子和。利用公式进行求和,不熟悉公式请自行搜索,详见代码。


附上AC代码:

#include <bits/stdc++.h>//#pragma comment(linker, "/STACK:102400000, 102400000")using namespace std;const int maxn = 710;const int maxm = 127;bool is_prime[maxn] = {true, true};int prime[maxm];int n;void filter(){int cnt = 0;for (int i=2; i<maxn; ++i)if (!is_prime[i]){prime[cnt++] = i;for (int j=i*i; j<maxn; j+=i)is_prime[j] = true;}// printf("%d\n", cnt);}int main(){#ifdef LOCALfreopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);#endiffilter();int T;scanf("%d", &T);while (T--){scanf("%d", &n);int ans=1, res=n;for (int i=0; i<maxm&&prime[i]*prime[i]<=n; ++i)if (n%prime[i] == 0){int t = n;while (n%prime[i] == 0)n /= prime[i];t = t/n*prime[i];ans *= ((t-1)/(prime[i]-1));}if (n > 1)ans *= (n+1);printf("%d\n", ans-res);}return 0;}


1 0
原创粉丝点击