ACM-ICPC 2018 南京赛区网络预赛 J Sum - 线性筛+找规律
程序员文章站
2022-06-04 12:24:34
...
思路:
先利用线性筛筛出素数和每个数的最小质因数x
然后地推出每个数的f函数值
1、若i%(x*x*x)==0 =>0
2、若i%(x*x)==0 =>cnt[i]=cnt[i/(x*x)]
3、若i%(x)==0 =>cnt[i]=2*cnt[i/x]
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
#define ll long long
const int N=20000005;
bool check[N];
int prime[N],minprime[N];
ll cnt[N];
void init(){
memset(check,true,sizeof(check));
check[1]=false;
int tot=0;
for(int i=2;i<=N;i++){
if(check[i]){
prime[tot++]=i;
minprime[i]=i;
}
for(int j=0;j<tot&&i*prime[j]<=N;j++){
check[i*prime[j]]=false;
minprime[i*prime[j]]=prime[j];
if(i%prime[j]==0)break;
}
}
cnt[1]=1;
for(int i=2;i<=N;i++){
int x=minprime[i];//数i的最小质因数
if(i%(x*x*x)==0)cnt[i]=0;
else if(i%(x*x)==0)cnt[i]=cnt[i/(x*x)];
else if(i%x==0)cnt[i]=2*cnt[i/x];
}
for(int i=2;i<=N;i++){
cnt[i]+=cnt[i-1];
}
}
int main(){
int n,t;
init();
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%lld\n",cnt[n]);
}
}
上一篇: 煮牛肉放什么调料会很香小窍门
下一篇: DataTable 转List