首页 > 其他分享 >筛法瞎写

筛法瞎写

时间:2022-11-20 10:45:38浏览次数:38  
标签:return 筛法 int long 200010 include mod

看见APJifengc在写min25筛发现我这个东西都不会了。赶紧复习了一把去写点题。写一个更一个。

loj6682 梦中的数论

答案显然 \(\frac 12\sum_{i=1}^n\binom{d(i)}{2}=\frac 12\sum_{i=1}^nd^2(i)-d(i)\) 。推导略,以前好像写过。

对了 \(\sum_{i=1}^nd(i)\) 是个傻逼问题,我拿这个诈骗joke3579然后他被骗了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int mod=998244353;
long long n,m,sq,cnt,sum,g[200010],w[200010];
int p[200010],pos1[200010],pos2[200010];
bool v[200010];
long long find(long long x){
    return x<sq?pos1[x]:pos2[n/x];
}
void get(int n){
    for(int i=2;i<=n;i++){
        if(!v[i])p[++cnt]=i;
        for(int j=1;j<=cnt&&i*p[j]<=n;j++){
            v[i*p[j]]=true;
            if(i%p[j]==0)break;
        }
    }
}
long long s(long long x,long long y){
    if(p[y]>=x)return 0;
    long long ret=(g[find(x)]-g[find(p[y])]+mod)%mod;
    for(int i=y+1;i<=cnt&&1ll*p[i]*p[i]<=x;i++){
        for(long long j=p[i],e=1;j<=x;j=j*p[i],e++){
            ret=(ret+1ll*(e+1)*(e+1)*(s(x/j,i)+(e>1)))%mod;
        }
    }
    return ret;
}
int main(){
    scanf("%lld",&n);
    sq=sqrt(n);
    get(sq);
    for(long long l=1,r;l<=n;l=r+1){
        r=n/(n/l);
        w[++m]=n/l;
        sum=(sum+1ll*w[m]*(r-l+1))%mod;
        if(w[m]<sq)pos1[w[m]]=m;
        else pos2[n/w[m]]=m;
        g[m]=4ll*(w[m]-1)%mod;
    }
    for(int j=1;j<=cnt;j++){
        for(int i=1;i<=m&&1ll*p[j]*p[j]<=w[i];i++){
            g[i]=(g[i]-1ll*(g[find(w[i]/p[j])]-g[find(p[j-1])])%mod+mod)%mod;
        }
    }
    long long ans=1ll*(s(n,0)+1-sum+mod)%mod*((mod+1)>>1)%mod;
    printf("%lld\n",ans);
    return 0;
}

标签:return,筛法,int,long,200010,include,mod
From: https://www.cnblogs.com/gtm1514/p/16907988.html

相关文章

  • 素数筛法及其优化策略
    暴力算法寻找素数的效率是底下的,可以通过素数筛法来在一个自然数表中标记处素数。Eratosthenes筛法首先是Eratosthenes筛法,基本方法就是首先排除所有大于2的偶数,然后从3......
  • 数组~筛法求素数
    题目描述用筛法求之N内的素数。 用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列,1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后......
  • 牛客竞赛数学专题—整数分解与筛法
    题目链接A.青蛙的约会B.SumofConsecutivePrimeNumbersC.PrimeDistanceD. PrimeLandE. X-factorChainsA.青蛙的约会statement:两只......
  • CF776B Sherlock and his girlfriend 筛法
    一道略显思维的筛法题Sherlockandhisgirlfriend题面翻译题目描述Sherlock有一个新女朋友。现在情人节就要到了,他想送给她一些珠宝。他买了几件首饰。第\(i\)件......
  • 质数筛法
    埃式筛原理:如果x是质数,那么x的倍数2x,3x…nx一定不是质数输入一个数n,就可以知道1-n中有多少个质数:intn; intret=0; cin>>n; int*prime=newint[......
  • 【模板】筛法
    \(prime\)constintN=1e7+10;intprime[N];boolnotprime[N];intminprime[N];voidprime_sieve(constintmaxn){ registerinti,multi_helper; registerin......
  • 埃拉托斯特尼筛法——求1-n内质数个数的最快算法
    埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数......
  • 埃拉托斯特尼筛法(埃式筛,筛选数字n范围内的素数)
     古希腊数学家 埃拉托色尼/埃拉托斯特尼(Eratosthenes)除了在2000多年前就发现地球不是平的之外,还发明了本文中讨论的埃式筛(一种通过筛除一个素数所有的倍数,从而识别素数......
  • 517 筛法求约数和
    视频链接: #include<iostream>usingnamespacestd;constintN=1000010;intp[N],vis[N],cnt;//g[i]表示i的最小质因子的1+p^1+...+p^kintg[N],f[N];//f[......
  • 516 筛法求约数个数
    视频链接:#include<iostream>usingnamespacestd;constintN=1000010;intp[N],vis[N],cnt;inta[N];//a[i]记录i的最小质因子的次数intd[N];//d[i]记录i......