【数论】[素数筛,phi]P3601签到题
题目描述
给出l,r,要求求出\(\sum_{i = l}^r (i - phi[i]) mod 666623333\)
\(1\leq l\leq r\leq 10^{12}\),\(r - l \leq 10^6\)
Solution
对于一个数n,肯定有至少一个小于等于$\sqrt n $的(质)因子。因为 \(r \leq 10^{12}\),所以可以先预处理\(10^{6}\)以内的素数, 然后利用r - l比较小的条件,一个一个数筛一遍就是了。用每个质因子去筛l - r之间的数,同时求出每个数的phi。对于个别的大于\(\sqrt n\)的因子,最后特判就行了。
\(\phi (x) = n (1 - \frac {1}{p1})(1 - \frac {1}{p2})...(1 - \frac {1}{pk})\)
Code
#include <iostream>
#include <cstdio>
using namespace std;
inline long long read() {
long long x = 0; int f = 0; char c = getchar();
while (c < '0' || c > '9') f |= c == '-', c = getchar();
while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return f? -x:x;
}
const int mod = 666623333;
long long l, r, ans;
int pri[1000006], cnt;
long long k[1000006], phi[1000006];//k记录原来的数
bool b[1000006];
inline void get_pri() {
for (int i = 2; i <= 1000; ++i)
if (!b[i]) for(int j = i << 1; j <= 1000000; j += i) b[j] = 1;
for (int i = 2; i <= 1000000; ++i)
if (!b[i]) pri[++cnt] = i;
}
int main() {
get_pri();
l = read(); r = read();
for (long long i = l; i <= r; ++i) phi[i - l] = k[i - l] = i;//初始化
for (int i = 1; i <= cnt; ++i)
for (long long p = pri[i], j = max(2ll, (l - 1) / p + 1) * p; j <= r; j += p) {
//找一个最小的开始筛的数,手推一下
long long x = j - l;
phi[x] = phi[x] / p * (p - 1);//计算phi
while (k[x] % p == 0) k[x] /= p;//为后面判断是否有大因子最铺垫
}
for (long long i = l; i <= r; (ans += i - phi[i - l]) %= mod, ++i)//写的有点非人类hhh
if (k[i - l] != 1) phi[i - l] = phi[i - l] / k[i - l] * (k[i - l] - 1);
//特判
printf("%lld\n", ans);
return 0;
}
【数论】[素数筛,phi]P3601签到题的更多相关文章
- luogu P3601 签到题
链接P3601 签到题 求\[\sum_{i=l}^{r} i-\phi_i\] \(l,r\leq 10^{12},\ r-l\leq 10^6\) 杜教筛似乎做不了. 然后再看\(l\),\(r\ ...
- A 洛谷 P3601 签到题 [欧拉函数 质因子分解]
题目背景 这是一道签到题! 建议做题之前仔细阅读数据范围! 题目描述 我们定义一个函数:qiandao(x)为小于等于x的数中与x不互质的数的个数. 这题作为签到题,给出l和r,要求求. 输入输出格式 ...
- 洛谷P3601签到题(欧拉函数)
题目背景 这是一道签到题! 建议做题之前仔细阅读数据范围! 题目描述 我们定义一个函数:qiandao(x)为小于等于x的数中与x不互质的数的个数. 这题作为签到题,给出l和r,要求求. 输入输出格式 ...
- LightOJ-1259 Goldbach`s Conjecture 数论 素数筛
题目链接:https://cn.vjudge.net/problem/LightOJ-1259 题意 给一个整数n,问有多少对素数a和b,使得a+b=n 思路 素数筛 埃氏筛O(nloglogn),这 ...
- 洛谷 P3601 签到题
https://www.luogu.org/problemnew/show/P3601 一道关于欧拉函数的题. 读完题目以后我们知道所谓的$aindao(x)=x- \phi (x) $. 对于x小的 ...
- P3601 签到题
思路 注意到求的qiandao(x)就是\(x-\phi(x)\) 但是\(l,r\le 10^{12}\),所以不能直接杜教筛 但是\(r-l\le 10^{6}\),所以可以先筛出1e6(\(\s ...
- 洛谷P3601 签到题
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- Bi-shoe and Phi-shoe LightOJ - 1370(数论+素数筛)
题目链接:https://vjudge.net/problem/LightOJ-1370 题意:给你N个欧拉函数值,找出每一个大于等于该欧拉函数值的数,并且要求相加和最小. 题解:因为素数i的欧拉函数 ...
- POJ3292 Semi-prime H-numbers [数论,素数筛]
题目传送门 Semi-prime H-numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10871 Acce ...
随机推荐
- PTA 甲级 1139
https://pintia.cn/problem-sets/994805342720868352/problems/994805344776077312 其实这道题目不难,但是有很多坑点! 首先数据 ...
- ES7.3.0配置
# elasticsearch.yml cluster.name: my-application node.name: node-1 node.master: true node.ingest: tr ...
- Python列表(list)所有元素的同一操作
针对很普遍的每个元素的操作会遍历每个元素进行操作. 这里给出了几种写法,列表每个元素自增等数学操作同理: 示例:整形列表ilist加1个数.元素类型转字符串: ilist = [1, 2, 3, 10 ...
- 在ASP.NET Core中获取客户端和服务器端的IP地址(转载)
随着ASP.NET的发展,有不同的方式从请求中访问客户端IP地址.WebForms和MVC Web应用程序只是访问当前HTTP上下文的请求. var ip = HttpContext.Current. ...
- Java线程池定制ThreadPoolExecutor官方定制实例
1.仍然先看构造方法:ThreadPoolExecutor构造方法 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,lon ...
- 【转载】Jupyter Notebook 常用快捷键
原文:http://blog.csdn.net/lawme/article/details/51034543 Jupyter Notebook 有两种键盘输入模式.编辑模式,允许你往单元中键入代码或文 ...
- 锤子剪刀布pat-1018
题目描述 大家应该都会玩“锤子剪刀布”的游戏:现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入描述: 输入第1行给出正整数N(<=105),即双方交 ...
- 面试题:java内存中的堆区和数据结构中的堆有什么区别
java内存中的堆是一个 链表, 数据结构中的堆:就是一个栈
- rabbitmq:配置rabbitmq-management插件
rabbitmq提供了一个图形的管理界面,用于管理.监控rabbitmq的运行情况,它是以插件的形式提供的,如果要启用需要启用插件 一.启用插件 rabbitmq-plugins enable rab ...
- 记Html的初次接触
第一次接触Html是在昨天的培训班体验课上,这一次课我明白了许多. 1.程序语言比我想象中还要多(原来除了C与Java还有这么多) 2.程序员毕业后掌握7种语言是很正常的事(难怪程序员会秃顶) 3.H ...