首页 > 代码库 > HDU1215 七夕节(因子之和)
HDU1215 七夕节(因子之和)
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1215
题目描述:
七夕节
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 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <vector> 5 using namespace std; 6 7 const int N = 500010; 8 9 struct Factor { 10 int p, e; 11 Factor(int p = 0, int e = 0) :p(p), e(e) {} 12 }; 13 14 bool not_prime[N] = { 1,1,0 }; 15 vector<int> P; 16 17 void E_prime() { 18 int m = (int)sqrt(N + 0.5); 19 for (int i = 2; i <= m; ++i)if (!not_prime[i]) 20 for (int j = i*i; j < N; j += i) 21 not_prime[j] = true; 22 for (int i = 2; i < N; ++i)if (!not_prime[i])P.push_back(i); 23 } 24 25 void Divided_by_Prime(int n, vector<Factor>& ve) { 26 double f = sqrt(n); 27 int t = 0; 28 for (int i = 0; P[i] <= f&&i < N; ++i) 29 if (n%P[i] == 0) { 30 ve.push_back(Factor(P[i], 1)); 31 ++t, n /= P[i]; 32 while (n%P[i] == 0) { n /= P[i]; ++ve[t - 1].e; } 33 } 34 if (!not_prime[n])ve.push_back(Factor(n, 1)); 35 } 36 37 int main() { 38 E_prime(); 39 int t, n; 40 scanf("%d", &t); 41 while (t--) { 42 scanf("%d", &n); 43 vector<Factor> ve; 44 Divided_by_Prime(n, ve); 45 int sum = 1; 46 for (int i = 0; i < (int)ve.size(); ++i) 47 sum *= ((int)(pow(ve[i].p, ve[i].e + 1) + 1e-3) - 1) / (ve[i].p - 1); 48 printf("%d\n", sum - n); 49 } 50 }
HDU1215 七夕节(因子之和)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。