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;
}