您的位置:首页 > 其它

51nod1441 士兵的数字游戏

2017-08-25 16:17 246 查看


对于一个数,可以玩的轮数就是它质因子的个数。先预处理出来5e6以内所有数的质因子数,因为给出的是a!/b!的形式,两个数乘除就相当于质因子数的加减,所以可以求一下前缀和。

#include<stdio.h>
using namespace std;

struct p{
int k, tot;
} a[5000100];
int f[5000100];
int s[5000100];

int main(){
for(int i = 2; i <= 5000000; i++) a[i].k = i;
for(int i = 2; i <= 5000000; i++){
if(f[i] == 0){
a[i].tot = 1;
for(int j = 2 * i; j <= 5000000; j += i){
f[j] = 1;
while(a[j].k % i == 0 && a[j].k != 0){
a[j].k /= i;
a[j].tot++;
}
}
}
}
for(int i = 1; i <= 5000000; i++){
s[i] = s[i - 1] + a[i].tot;
}
int t;
scanf("%d", &t);
for(int i = 1; i <= t; i++){
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", s[a] - s[b]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: