ACM-ICPC 2018 南京賽區網絡預賽

J題預處理,先打個線性篩,把1到n全都分解質因數,計算貢獻,每個次冪爲一的質因子貢獻*2,次冪爲2的質因子不算貢獻,有超過2次冪的質因子那麼這個數字就可以直接置爲0了 

#include <set>
#include <map>
#include <deque>
#include <stack>
#include <queue>
#include <time.h>
#include <vector>
#include <string>
#include <math.h>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define PI acos(-1)
#define ll long long
#define inf 0x3f3f3f3f
#define ull unsigned long long
using namespace std;

const int N = (int)2e7 + 5;
bool isp[N];
int p[N],dp[N],sum[N],cnt;
void init()
{
    cnt=0;
    memset(dp,0,sizeof(dp));
    memset(isp,true,sizeof(isp));
    for(int i=2;i<N;i++)
    {
        if(isp[i]) p[++cnt]=i;
        for(int j=1;j<=cnt&&i*p[j]<N;j++)
        {
            isp[i*p[j]]=false;
            dp[p[j]*i]=p[j];//這個數的最小的質因子是p[j]
            if(i%p[j]==0) break;
        }
    }
    sum[1]=1;
    for(int i=2;i<N;i++)
    {
        if(!dp[i]) sum[i]=2;
        else if(((i/dp[i])%(dp[i]*dp[i]))==0) sum[i]=0;
        else if((i/dp[i])%dp[i]==0) sum[i]=sum[i/dp[i]]/2;
        else sum[i]=sum[i/dp[i]]*2;
    }
   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章