CodeForces-546D Soldier and Number Game

来源:互联网 发布:i排版软件下载 编辑:程序博客网 时间:2024/05/24 03:38
#include <iostream>#include <cstdio>using namespace std;int t, a, b;const int maxn = 5000005;int sum[maxn] = {0};int prime[maxn] = {0};inline void init(){    prime[1] = 1;    for(int i = 2; i < maxn; i ++)    {        if(prime[i] > 1)            continue;        prime[i] = 1;        for(int j = 2; i * j < maxn; j ++)            prime[i * j] = prime[j] + 1;    }    for(int i = 1; i < maxn; i++)            sum[i] = sum[i - 1] + prime[i];}int main(){    init();    cin >> t;    while(t --)    {        scanf("%d %d", &a, &b);        printf("%d\n", sum[a] - sum[b]);    }    return 0;}
题意:给出一个n,n开始是a!/b!,每次用一个x去整除n得到新的n,最后当n变成1的时候经过了几轮得分就是这个轮数,要求最大的分数是多少。
题解:题目很烦..其实也是很简单..(但是很难表达..)就是输入a和b,n的值就是a!除以b!,然后除以>1的数,要求除的次数最多,即除的数是从最小的素数开始,这样次数就最多。主要考虑一个速度问题,不然就time limit exceeded,写的代码的就是建一个一维数组,数组存放的内容是数组下标的质因数的个数....(初始化全为0)上面的第二个循环for(int j = 2; i * j < maxn; j ++) prime[i * j] = prime[j] + 1;很难理解..自己模拟一遍..差不多就是 一开始是2..之后所有下标是2的倍数全+1,再是3..之后所有下标是3的倍数全+1..以此类推..难说难说 模拟一遍感受感受就好..例如48 i = 3 j = 16 ,prime[16] = 4,所以 prime[3 * 16] = prime[16] + 1 = 5。还有就是算sum..不能一次又一次从头加,从上一项和加。这样就不会超时。
0 0