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

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



数字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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值