欧拉筛 模板 and 2018 ICPC 南京网络赛 J

欧拉筛模板:

const int maxn=1e7+10;
int cnt=0,prime[maxn];
bool isvisited[maxn];
void solve(int n){//筛 1-n 的数 
	for(int i = 2; i < n; i ++) {
	    if(!isvisited[i])
	        prime[cnt ++] = i;
	    for(int j = 0; j < cnt; j ++) {
	        if(i * prime[j] > n) break;
	        isvisited[i * prime[j]] = true;//每个合数都被他的最小质因数标记
	        if(i % prime[j] == 0)   break; //当发现某个合数存在更小的质因数时就停止标记
	    }
	}	
}

 

有关例题: https://nanti.jisuanke.com/t/A1956 

本题并未运用欧拉筛,而只是借用了欧拉筛的思想

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e7+5;
int prim[maxn],tot=0;
int vis[maxn],miu[maxn];
int ans[maxn];
void solve(){
    ans[1]=1;//1对答案的贡献只有1
    for(int i=2;i<maxn;i++){
        if(vis[i]==0) prim[tot++]=i,ans[i]=2;//质数对答案的贡献为2
        for(int j=0;j<tot;j++){
            int k=prim[j]*i;
            if(k>=maxn) break;
            vis[k]=1;//上述均为欧拉筛的思想,不再解释  
            if(i%prim[j]) ans[k]=ans[i]*ans[prim[j]];//如果i不含有该质因子,无论i怎么分解,乘以该质因子之后都不会出现平方数,直接dp即可
            else{//如果i含有该质因子 
                int tp=prim[j]*prim[j];
                if(i%tp==0) ans[k]=0;//如果仅含有一个质因子还有救,两个质因子分开放就行了。
									//否则就凉凉了,无论怎么放,a和b总会有一个含有平方因子
                else ans[k]=ans[k/tp];// 该质因子被固定,i中也要拿出该质因子固定,则只有i/质因子自由 
                break;
            }
        }
    }
}
int main(){
    solve();
    for(int i=1;i<maxn;i++){
        ans[i]+=ans[i-1];
    }
    int t,n;
	scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        printf("%d\n",ans[n]);
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值