数论训练之一

http://www.codevs.cn/problem/3223/

L,R的范围太大了,不可能直接筛素数

但考虑到R-L的范围在能承受的范围内,

这时候就要用到

区间筛:

主体思想与其他筛法一致,

但一般题目中数据范围比较大(L<R<=10^12),但也有个利于我们的限制条件(R-L<=10^6)

那就很简单了,根据我们熟知的理论,

R以内的合数的最小质因数不会大于√R,

所以我们就可以筛出[1,√R]内的素数并用这些素数去筛除[a,b]的合数。

code:

#include<iostream>
#include<cstdio>
using namespace std;
long long l,r,ans;
bool f1[1000010],f2[1000010];
inline void ask(long long a,long long b)
{
    for(long long i=2;i*i<=b;i++)
    {
        if(!f1[i])
        {
            for(long long j=2*i;j*j<=b;j+=i)f1[j]=1;
            for(long long j=max(2LL,(a+i-1)/i)*i;j<=b;j+=i)
                f2[j-a+1]=1;
        }
    }
    for(long long i=1;i<=b-a+1;i++)
        if(!f2[i])
            ans++;
}
int main()
{
    scanf("%lld%lld",&l,&r);
    ask(l,r);//区间筛
    printf("%d",ans);
}

原文地址:https://www.cnblogs.com/wzxbeliever/p/11625076.html

时间: 2024-10-11 02:07:07

数论训练之一的相关文章

数论训练之四

https://www.luogu.org/problem/P3978 题目描述: 对于一棵随机生成的n个结点的有根二叉树(所有互相不同构的形态等概率出现),它的叶子节点数的期望是多少呢? 不同构的二叉树数目显然是卡特兰数(因为这题目描述的不同构节点标号也要不同) 节点数期望是等于(各种情况的节点数)/(不同构二叉树数目) 那怎么算各种情况的节点数之和呢?有点技巧了 考虑n-1个点现在还没连边 此时第n个点就有2(n-1)个位置可以插入 又因为实际上他们是连了n-2条边的,所以实际上只有n个位置

校队训练赛,同时也是HDU4497(数论:素数分解+组合数学)

一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=4497 二.思路 将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y',x') = 1,同时lcm(x',y',x') = G/L.特判,当G%L != 0 时,无解.然后素数分解G/L,假设G/L = p1^t1 * p2^t2 *````* pn^tn.满足上面条件的x,y,z一定为这样的形式.x' = p1^i1 * p2^i2 *```* pn^in.y' =

UESTC 电子科大专题训练 数论 L

UESTC 1723 题意:中文题 思路:预处理,dp[i][j]表示将j个人放到i个房间里,则可以得到dp[i][j]=dp[i][j-1]*i + dp[i-1][j-1],递推式的理解,第一:当有i个房间,j-1个人的时候方案数已知为dp[i][j-1],则当增加一个人的时候,第j个人可以选择i个房间的任意一个,或者选择一个新的房间,但是只有选择已有的i个房间才能递推得dp[i][j],第二:当有i-1个房间,j-1个人时,增加一个人,这个人有i+1种选择(i种选择为选择已有的房间,第i+

UESTC 电子科大专题训练 数论 G

UESTC 1718 题意:在01串中选出长度为偶数,并且前一半是0,后一半是1的子序列方案数 思路:组合数+范德蒙恒等式 记录每个数前面0的个数pi和后面1的个数nexi(包括本身)遍历到第k个数的时候,如果是0 那么方案数为(因为计算第i位时,前面计算的i-1个答案都不包含这一位,但是第i位计算的答案都包含第i位 所以没有重复) for(i=0, -> i=min(pi-1,nexi)) C(pi-1,i)*C(nexi,i+1) 可以由 C(l-1,i)=C(l,i+1)-C(l-1,i+

ACdream HUT新生摸底训练赛 E - 娜娜梦游仙境系列——莫名其妙的插曲 数论

解题思路:其实就是找能组成的最大集合.max(a[1],a[2],a[3].........a[n])/gcd(a[1],a[2],a[3],......a[n]) 解题代码: 1 // File Name: e.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月13日 星期一 13时56分11秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #i

UESTC 电子科大专题训练 数论 E

UESTC 1716 题意:中文题 思路:先把男生排列,由于是圆桌,所以每个位置都是一样的,排列方案为A(n,n)/n,再对女生排列,由于男生已经在座位上了,所以此时每个座位是不一样的,方案数为A(n,n) AC代码: #include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #in

【NOIP训练】【规律+数论】欧拉函数的应用

Problem 1 [题目大意] 给出 多组数据 ,给出  求出 . 题解 证明:  除了 以为均为偶数, 所以互质的个数成对. 由 得 . 所以对于每对的和为 , 共有 对 . 则 Problem 2 [题目大意] 在第一个圆上写入  ,在第二个圆上写入 ,此后每一次在前一个圆的基础上,每两个数之间写上他们的和,定义 为第i个圆中数字i的个数. 给出 ,求 . 题解 证明: 则 ,圆中的数字相邻两两互质. 对于一个数字 只可能由与他互质的两个数 相加而成并且每一种构造方法是唯一的. 所以 .

[pandaking训练7]-----基础数论 c题 hdu2138 miller-robbin判断素数

就存个板子吧:具体想学算法的可以看其他博客..... 1 #include <bitset> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <cstdio> 6 #include <cmath> 7 using namespace std; 8 typedef long long LL; 9 LL mul(LL a, LL b,

[日常训练]养花(分块+数论)

Description 给定一个长度为 \(n\) 的数组 \(a\). 要求回答 \(m\) 个询问. 对于每个询问,给出 \(l,r,k\),求 \(max_{i=l}^{r}\left\{ a_i\ \%\ k \right\}\). \(1\leq n,a_i,l,r,k \leq 10^5+1\). Solution 分块,块数 \(100\). 记 \(f[i][j]\) 表示第 \(i\) 块的数 \(\%j\) 的最大值,考虑怎么求 \(f[i][j]\). 显然有 \(a_i\