首页 > 编程语言 >2024/1/17 算法笔记

2024/1/17 算法笔记

时间:2024-01-17 23:22:44浏览次数:17  
标签:prime 17 int 合数 2024 算法 void isprime 质数

1. 欧拉质数筛

功能是给一个整数n查找小于等于n的所有质数。

最后使用的是prime【i】

//功能:查找n内第x个质数。
bool isprime[100000010]; //isprime[i]=1表示:i是素数
int prime[6000010],cnt=0;//prime存质数

void getprime(int n){ //筛到n  也就是n以内的质数
    memset(isprime, 1, sizeof isprime);
    isprime[1] = 0;
    for(int i=2;i<=n;i++){
        if(isprime[i]){ //没筛掉
            prime[++cnt] = i;
        }
        

        for(int j = 1; j<=cnt&&i*prime[j]<=n;j++){
            //从Prime[1],即最小质数2开始,逐个枚举已知的质数,并期望Prime[j]是(i*Prime[j])的最小质因数
            //当然,i肯定比Prime[j]大,因为Prime[j]是在i之前得出的
            isprime[i*prime[j]] = 0;
            if(i % prime[j] == 0)//i中也含有Prime[j]这个因子   确定prime[j]是prime[j]*i的最小质因数
    			break; //重要步骤。见原理
        }
    }
}

2. 区间质数筛

亿级 的数量级,遍历肯定会超时,所以我们使用美猴王合数的一个性质:可以分解为两个不为1且不等于本身的因子相乘 即 n=a*b(n为合数)

所以在1~500000中我们是可以找到500000^2的数的质因子的。所以我们可以晒出所有的合数,剩下的就是质数啦。

  1. 筛出1-50000中的所有质数,并且对合数打上标记.
  2. 在L-R的范围呢用我们已求出的质数筛出其中的合数(设p为质数,则i*p一定不为质数),并对其打上标记
  3. 遍历L-R,没有打标记的元素即为我们所求的素数
//线性筛
void gprime(){
    for(int i=2;i<=50000;i++){
        if(!vis[i]) prime[++cnt] = i;
        for(int j=1;i*prime[j]<=50000;j++){
            vis[i*prime[j]] = 1;
            if(i%prime[j] == 0) break;//目的是保证prime[j]是最小质因数
        }
    }
}

void solve(){
    cin>>l>>r;
    if(l==1) l=2;
    gprime();//筛出根号r内所有的质数和剩下的合数。
    memset(vis,0,sizeof vis);
    for(int i=1;i<=cnt;i++){
        LL p = prime[i];
        LL start = (l+p-1)/p*p>2*p?(l+p-1)/p*p:2*p;//找到大于l的第一个能被p整除的数开始。
        for(LL j = start;j<=r;j+=p) 
            vis[j-l+1]=1; //从j开始标记,会爆空间,所以我们进行压缩。如果不想这样做也可以使用map,但是不方便。
    }
    for(int i=1;i<=r-l+1;i++) if(!vis[i]) ans++;//那在这里我们就用区间之差来查找  这里和上面的prime是两个数组,所以不用担心交错。
    cout<<ans<<endl;
}

3. 组合数问题

普通组合数C(a,b)转换成杨辉三角的模型

如果是只要求前几个的话直接先乘后除就好了,比如Ci2什么的。

牢记公式:C(i , j) = C(i-1 , j) + C(i-1 , j-1)

预处理的话,就处理C11 = 1 然后Ci0 = 1

另外的,如果我们想知道在i和j在一个合法范围之内0<=i<=n,0<=j<=min(i,m)有多少对i,j满足Cij是k的倍数,我们需要求个数。做法是矩阵求和。

void func(){
    //求组合数。
    c[1][1] = 1;
    for(int i=0;i<=2000;i++){
        c[i][0] = 1;
    }
    for(int i=2;i<=2000;i++){
        for(int j=1;j<=i;j++){
            c[i][j] = (c[i-1][j] + c[i-1][j-1])%k; //取k模为0说明是倍数。0倍也算
        }
    }
    //矩阵求和求个数  优化n次查询
    for(int i=2;i<=2000;i++){
        for(int j=1;j<=i;j++){
            s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1];
            if(c[i][j] == 0) s[i][j] +=1;
        }
        s[i][i+1]=s[i][i];//继承.
    }
}

//另外我们在最后输出结果的时候,如果有m>n也就是Cij的j>i的情况,只要输输出Snn就好了。

标签:prime,17,int,合数,2024,算法,void,isprime,质数
From: https://www.cnblogs.com/Akimizuss101/p/17971471

相关文章

  • 1.17每日总结
    Python3基本数据类型Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。等号(=)用来给变量赋值。等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在......
  • 2023年总结,2024年展望
    前言转眼2023年就过去了。好像都没什么感觉,时间过得太快了,好像没留下多少痕迹。感觉疫情后整个人都没什么冲劲,加上大环境也不太好,什么职业规划、个人发展,好像都没什么人提了。不过虽然别人不提,现在这个环境下也没啥职业好规划的,先保住饭碗就好了,但是个人发展,还是要默默的、持......
  • 算法笔记之图论
    打开转盘锁你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字:'0','1','2','3','4','5','6','7','8','9'。每个拨轮可以自由旋转:例如把'9'变为'0','0'变为......
  • 2024省选联测12
    A.硬币给定\(n\),在满足\(x\timesy=n^2+1\)且\(x,y\ge2\)的前提下,最大化\(x+y\)。从后向前扫描序列,第\(i\)个数被扫到时为\(p\),\(p\)为质数或者为\(1\)。第\(i+kp,k\in\mathbb{Z}\)个数仍然是\(p\)的倍数。因为\[i^2+1\equiv0\modp\]所以\[(i+kp)^2+......
  • 算法笔记
    1.回溯法(Backtracking)应用:组合、排列、子集等组合型问题,0/1背包问题、图的着色问题等。时空复杂度:时空复杂度较高,指数级别。时间复杂度:O(2^n)或更高,其中n是问题规模。空间复杂度:O(n)或更高,取决于递归深度。特性:通过深度优先搜索遍历解空间。需要撤销选择,回溯到上一步......
  • 学习笔记——ST算法
    ST算法ST算法是一种运用倍增来解决RMQ问题也就是区间最值问题的算法。给定一个长度为\(N\)的序列\(A\),ST算法能在\(\mathcalO(NlogN)\)的时间预处理后,以\(\mathcalO(1)\)的时间在线回答区间最值问题。设\(F_{i,j}\)表示序列\(A\)中下标在子区间\(\left[i,......
  • 20240117
    从whk如活着回来了~~~觉得还是日更好以后就每天写一点喵主要是文章太少看着难受CF771DBearandCompany肯定是\(dp\),然后自己想的就没了qwq考虑如下的状态\(dp_{v,k,x,0/1}\)表示当前用了\(v,k,x\)个每种字符,最后一个字符是不是v的最小操作数考虑转移,每次多一个字......
  • 2024.1.17日报
    2.1.4.1persist方法和cache方法RDD通过persist或cache方法可以将前面的计算结果缓存,但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD将会被缓存在计算节点的内存中,并供后面重用。通过查看RDD的源码发现cache最终也是调用了persist无参方......
  • 从嘉手札<2024-1-17>
    昨天我以为人生是一场体验是一辆不会回头的列车我们遇到了风景感悟了风景放下了风景构成了自己今天我以为静水流深、光而不耀可多思必多疑思维是一种极为复杂的东西我曾经觉得知行合一是对自我内心的绝对控制后来发觉这只不过是骗局因为王阳明成功了所以我认可知行......
  • 闲话1.17
    今天摆了。写了写jimmy题单,感觉题大部分还不错......