题解-Sakuya's task
题面
\[\left(\sum_{i=1}^n\sum_{j=1}^n \varphi(\gcd(i,j))\right)\bmod 10^9+7
\]
数据范围:\(1\le n\le 10^{10}\)。
蒟蒻语
考场爆零真开森。
本来以为要卷 \(1*1\),没想到真要卷 \(1*1\),只不过要一个一个卷……
考场上还以为要洲阁 \(\tt Min\_25\)。
正解
先莫反操作一发:
&\sum_{i=1}^n\sum_{j=1}^n \varphi(\gcd(i,j))\\
=&\sum_{d=1}^n \varphi(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}\epsilon(\gcd(i,j))\\
=&\sum_{d=1}^n\varphi(d)\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)\lfloor\frac{n}{dk}\rfloor^2\\
=&\sum_{T=1}^n\lfloor\frac{n}{T}\rfloor^2\sum_{d|T}\varphi(d)\mu(\frac{T}{d})\\
\end{split}
\]
整除分块左边,右边杜教。
第一次杜教:\(f_1=\varphi\),\(g_1=1\),\(f_1*g_1=id\)。
第二次杜教:\(f_2=\varphi*\mu\),\(g_2=1\),\(f_2*g_2=\varphi=f_1\)。
求 \(f_2\) 会多次调用 \(f_1\),但是内部调用的函数 \(x\) 集相等,所以可以一起求:
//Dusieve
bool vis[iN+1];
int duphi[iN+1],dupm[iN+1];
int Phi(ll x){return x<=N?phi[x]:duphi[n/x];}
int Pm(ll x){return x<=N?pm[x]:dupm[n/x];}
void Dusieve(ll x){
if(x<=N||vis[n/x]) return;
vis[n/x]=true;
for(ll l=2,r;l<=x;l=r+1){
r=x/(x/l),Dusieve(x/l);
(duphi[n/x]-=(ll)(r-l+1)*Phi(x/l)%mod)%=mod;
(dupm[n/x]-=(ll)(r-l+1)*Pm(x/l)%mod)%=mod;
}
(duphi[n/x]+=(ll)x%mod*(x%mod+1)/2%mod)%=mod;
(dupm[n/x]+=duphi[n/x])%=mod;
(duphi[n/x]+=mod)%=mod,(dupm[n/x]+=mod)%=mod;
}
还有个问题:怎么线性筛 \(\varphi*\mu\)?
其实可以狄利克雷前缀和一下,但是这里有个更妙的方法:
\(\mu\) 与 \(\varphi\) 为积性,\(\varphi*\mu\) 必为积性。
根据 \(\mu\) 函数的性质与找规律可得:
(\varphi*\mu)(p)=p-2\\
(\varphi*\mu)(p^2)=p(\varphi*\mu)(p)+(\varphi*\mu)(1)\\
(\varphi*\mu)(p^3)=p(\varphi*\mu)(p^2)\\
\]
然后根据积性函数性质,就可以线性筛了。
时间复杂度 \(\Theta(n^{\frac{2}{3}})\)。
代码
取模坑死蒟蒻,细节会有注释。
#include <bits/stdc++.h>
using namespace std;
//Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair(a,b)
#define x first
#define y second
#define be(a) a.begin()
#define en(a) a.end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
//Data
const int mod=1e9+7;
ll n; int ans;
//Sieve
const int N=1e7,iN=1e3;
bool np[N+1];
int phi[N+1],pm[N+1],cnt,p[N];
void Sieve(){
np[1]=true,phi[1]=pm[1]=1;
for(int i=2;i<=N;i++){
if(!np[i]) p[cnt++]=i,phi[i]=i-1,pm[i]=i-2;
for(int j=0;j<cnt&&i*p[j]<=N;j++){
np[i*p[j]]=1;
if(i%p[j]==0){
phi[i*p[j]]=(ll)phi[i]*p[j]%mod;
if((i/p[j])%p[j]==0) pm[i*p[j]]=(ll)pm[i]*p[j]%mod;
else pm[i*p[j]]=((ll)pm[i]*p[j]+pm[i/p[j]])%mod;
break;
}
phi[i*p[j]]=(ll)phi[i]*phi[p[j]]%mod;
pm[i*p[j]]=(ll)pm[i]*pm[p[j]]%mod;
}
}
for(int i=2;i<=N;i++)
(phi[i]+=phi[i-1])%=mod,(pm[i]+=pm[i-1])%=mod;
}
//Dusieve
bool vis[iN+1];
int duphi[iN+1],dupm[iN+1];
int Phi(ll x){return x<=N?phi[x]:duphi[n/x];}
int Pm(ll x){return x<=N?pm[x]:dupm[n/x];}
void Dusieve(ll x){
if(x<=N||vis[n/x]) return;
vis[n/x]=true;
for(ll l=2,r;l<=x;l=r+1){
r=x/(x/l),Dusieve(x/l);
(duphi[n/x]-=(ll)(r-l+1)*Phi(x/l)%mod)%=mod;
(dupm[n/x]-=(ll)(r-l+1)*Pm(x/l)%mod)%=mod;
}
(duphi[n/x]+=(ll)x%mod*(x%mod+1)/2%mod)%=mod;
(dupm[n/x]+=duphi[n/x])%=mod;
(duphi[n/x]+=mod)%=mod,(dupm[n/x]+=mod)%=mod;
}
//Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
Sieve(),Dusieve(n);
// cout<<Pm(n)<<'\n';
for(ll l=1,r;l<=n;l=r+1){
r=n/(n/l);
(ans+=(ll)(n/l%mod)*(n/l%mod)%mod*(Pm(r)-Pm(l-1)+mod)%mod)%=mod;
/*
杜教筛是在开始整除分块前开始的,但是为什么这里可以直接Pm调用呢?
蒟蒻的回答:因为杜教筛内部处理了所有n的整除分块的答案。
*/
}
cout<<ans<<'\n';
return 0;
}
祝大家学习愉快!
题解-Sakuya's task的更多相关文章
- 3.26-3.31【cf补题+其他】
计蒜客)翻硬币 //暴力匹配 #include<cstdio> #include<cstring> #define CLR(a, b) memset((a), (b), s ...
- HDU-3974 Assign the task题解报告【dfs序+线段树】
There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...
- 【题解】 CF11D A Simple Task
[题解] CF11D A Simple Task 传送门 \(n \le 20\) 考虑状态压缩\(dp\). 考虑状态,\(dp(i,j,O)\)表示从\(i\)到\(j\)经过点集\(O\)的路径 ...
- Codeforces 959F Mahmoud and Ehab and yet another xor task 线性基 (看题解)
Mahmoud and Ehab and yet another xor task 存在的元素的方案数都是一样的, 啊, 我好菜啊. 离线之后用线性基取check存不存在,然后计算答案. #inclu ...
- [CF11D]A Simple Task 题解
题解 我们从最简单的思路开始考虑,首先看到题目发现\(n\)非常小,于是很容易想到状态压缩. 我们考虑比较直觉的状态,f[i][j][k]表示以i为起点,当前在j,之前去过的点状态为k的简单环的方案数 ...
- [LeetCode]621. Task Scheduler 任务安排 题解
题目描述 给定一个char数组,代表CPU需要做的任务,包含A-Z,不用考虑顺序,每个任务能在1个单位完成.但是有规定一个非负整数n代表两个相同任务之间需要至少n个时间单位.球最少数量的时间单位完成所 ...
- HDU 3974 Assign the task(DFS序)题解
题意:给出一棵树,改变树的一个节点的值,那么该节点及所有子节点都变为这个值.给出m个询问. 思路:DFS序,将树改为线性结构,用线段树维护.start[ ]记录每个节点的编号,End[ ]为该节点的最 ...
- 题解报告:hdu 4907 Task schedule
Problem Description 有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务.有m个询问,每个询问有一个数字q,表示如果在q时间 ...
- CF 11D A Simple Task 题解
题面 这道题的数据范围一看就是dfs或状压啦~ 本文以状压的方式来讲解 f[i][j]表示目前的节点是i,已经经历过的节点的状态为j的简单环的个数: 具体的转移方程和细节请看代码: PS:(i& ...
随机推荐
- Selective Acknowledgment 选项 浅析 1
抓包的时候,发现 tcp 三次握手中一般会有几个options 一个是mss 一个是ws 一个sack perm 这次主要是来说一说 sack 这个选项: 1. 只重传超时的数据包,比较实用与后 ...
- 消失的两个数字(1-N缺两个数)
给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字.你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 以任意顺序返回这两个数字均可. 示例 1: 输入: [1]输出: [2,3 ...
- android开发导包升级到androidx踩坑记录【转载】
最近一直在做安卓开发,奈何手中的资料比较老,资料上的一些Import经常没有,十分让人头疼. 感谢简书上的[张晴天天天天天]做的整理. 在这里也记录一下备用. 升级Android Studio后,在 ...
- SMBv3远程代码执行漏洞复现(CVE-2020-0796)
漏洞基本信息 服务器消息块(SMB),是一个网络通信协议,用于提供共享访问到文件,打印机和串行端口的节点之间的网络上.它还提供了经过身份验证的进程间通信机制.SMB的大多数用法涉及运行Microsof ...
- CSRF和XSS的区别
XSS是啥? xss就是跨域脚本攻击 什么是跨域脚本攻击? 就是在正常的输入框中(如:用户名修改等)插入script恶意代码,从而在你遍历数据的时候加载该js文件, 获取你的cookie或sessio ...
- 云服务器-Ubuntu更新系统版本-更新Linux内核-服务器安全配置优化-防反弹shell
购入了一台阿里云的ESC服务器,以前都用CentOS感觉Yum不怎么方便,这次选的Ubuntu16.04.7 搭好服务之后做安全检查,发现Ubuntu16.04版本漏洞众多:虽然也没有涉及到16.04 ...
- ABBYY FineReader 15 新增编辑表格单元格功能
ABBYY FineReader 15(Windows系统)新增编辑表格单元格功能,在PDF文档存在表格的前提下,可将表中的每个单元格作为单独的文字块进行单独编辑,单元格内的编辑不会影响同一行中其他单 ...
- 网络系列之 jsonp 百度联想词
jsonp 可以跨域,ajax 不可以,ajax 会受到浏览器的同源策略影响,何为同源策略? 同源策略就是,如果 A 网站 想拿 B网站里的资源, 那么 有三个条件, 你得满足才能拿. 第一个:域名相 ...
- Comparator比较器
Comparator比较器 简介 为什么写? comparator 是javase中的接口,位于java.util包下,该接口抽象度极高,有必要掌握该接口的使用 大多数文章告诉大家comparator ...
- 【PYTEST】第三章参数化
知识点: 参数化 1. parametrize() 参数化测试用例 实际工作中,我们不可能就传一组数据,参数化支持多组数据测试,并且每组都会去执行,parametrize(), 第一个参数用逗号开分隔 ...