CodeForces - 546D Soldier and Number Game 素数筛选+前缀和

怎么说呢...这题和素数筛选的模板不太一样。。我还是太菜了,没办法学以致用55555...

先记录下来以后翻过来再看看吧。。附上AC代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<string>
#include<sstream>
#include<fstream>
#include<utility>
using namespace std;
#define pi acos(-1.0)
#define ll long long

typedef pair<int,int>pp;
const int INF=0x3f3f3f3f;
const ll MOD=1e9+7ll;

const int MAX=5000001;
//const int MAX=30;
int a,b;
bool isprime[MAX];
int num[MAX];
void init()
{
    memset(num,0,sizeof(num));
    memset(isprime,true,sizeof(isprime));
    isprime[1]=false;
    for(int i=2; i<MAX; i++)
    {
        if(isprime[i])
        {
            //cout<<endl<<"i="<<i<<endl;
            for(int j=i;j<MAX;j+=i)
            {
                //cout<<"j="<<j<<endl;
                int temp=j;
                while(temp%i==0)//先筛出质因数的个数
                {
                    //cout<<" temp="<<temp<<endl;
                    num[j]++;
                    temp/=i;
                }
                //cout<<" num["<<j<<"]="<<num[j]<<endl;
                isprime[j]=false;
            }
        }
    }
    for(int i=2; i<MAX; i++)//再加上之前的质数及其质因数
        num[i]=num[i]+num[i-1];
    /*for(int i=2; i<=20; i++)
        cout<<"i="<<i<<" isprime:"<<isprime[i]<<" num="<<num[i]<<endl;*/
}
int main()
{
    int t;
    scanf("%d",&t);
    init();
    while(t--)
    {
        scanf("%d%d",&a,&b);
        printf("%d\n",num[a]-num[b]);
    }
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Cc_Sonia/article/details/81459839
今日推荐