Codeforces Round #304 (Div. 2) 546D Soldier and Number Game 质因子个数

来源:互联网 发布:php访客统计 编辑:程序博客网 时间:2024/05/13 06:56

题意:两个军人玩游戏,第一个军人把一个数n交给第二个军人,第二个军人把n用x整除n,然后把n/x交给第一个军人。n=1时结束。问最大的回合数
思路:就等于求一个数的质因子个数,比如说4,就是 2*2 质因子个数就是2
num[i]就相当于dp
num[i]就是i的质因子个数,然后统计的时候num[i]=num[i/maxPrime[i]]+1
因为+1就是加我们除的那个质数,因为我们除的是质数,所以并不会浪费次数

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<math.h>#include<queue>#include<stack>#include<string>#include<vector>#include<map>#include<set>using namespace std;typedef long long LL;#define maxn 5000005#define f(x) (x*1.0)#define inf 0x3f3f3f3f#define maxm maxn*maxn#define lowbit(x) (x&(-x))#define cheak(i) printf("%d ",i)#define lson(x) (splay[x].son[0])#define rson(x) (splay[x].son[1])#define rfor(i,a,b) for(i=a;i<=b;++i)#define lfor(i,a,b) for(i=a;i>=b;--i)#define mem(a,b) memset(a,b,sizeof(a))#define mec(a,b) memcpy(a,b,sizeof(b))const double PAI=acos(-1.0);int maxPrime[maxn],num[maxn];LL sum[maxn];void init(){    int i,j;    mem(maxPrime,-1);    rfor(i,2,maxn-1)    {        if(~maxPrime[i]) continue;        for(j=i;j<maxn;j+=i)        maxPrime[j]=i;    }    num[1]=0;    rfor(i,2,maxn-1)    if(maxPrime[i]!=-1)     num[i]=num[i/maxPrime[i]]+1;    sum[1]=num[1];    rfor(i,2,maxn-1)    sum[i]=sum[i-1]+num[i];}int main(){    int T,a,b;    init();    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&a,&b);        printf("%lld\n",sum[a]-sum[b]);    }    return 0;} 
0 0
原创粉丝点击