七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:
![](https://i-blog.csdnimg.cn/blog_migrate/5f9c67c61cc20b21c03aa808dbcdcada.jpeg)
数字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;
}