HDU-----1215---七夕节

来源:互联网 发布:电子清标软件 编辑:程序博客网 时间:2024/06/06 01:27

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



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


本来是暴力打表,结果超时,居然可以直接暴力过,可能是数据比较水,500ms左右

#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<string>#include<algorithm>#include<map>#include<queue>#include<vector>#define PI acos(-1.0)#define INF 0x3f3f3f3f#define CL(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long LL;const int maxn = 5e5+10;const int MOD = 1e9+7; int cnt[maxn];int Get_fac(int a){int ans = 0;for(int i = 1; i*i <= a; i++){if(a%i == 0){if(i*i == a || i == 1) ans += i;else ans += i+a/i;}}return ans;}int main(){      int a, b, n, kcase = 1;    scanf("%d", &n);    while(n--){    scanf("%d", &a);printf("%d\n", Get_fac(a));}    return 0;  }

暴力不是首选,毕竟是容易超时,我们可以换一个思路,1-500000之间的数都可以成为因子,所以像打素数表一样

把所有因子可能出现的位置打表,可以压缩到120ms左右

#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<string>#include<algorithm>#include<map>#include<queue>#include<vector>#define PI acos(-1.0)#define INF 0x3f3f3f3f#define CL(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long LL;const int maxn = 5e5+10;const int MOD = 1e9+7; int cnt[maxn];int main(){      int a, b, n, kcase = 1;    for(int i = 1; i <= maxn; i++) cnt[i] = 1;    for(int i = 2; i <= maxn; i++){//i是因子,遍历范围内因子出现的地方并计算和    for(int j = i+i; j <= maxn; j += i) cnt[j] += i;}    scanf("%d", &n);    while(n--){    scanf("%d", &a);printf("%d\n", cnt[a]);}    return 0;  }

0 0
原创粉丝点击