题解-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& ...
随机推荐
- REDHAT 7.5beta 新推出的VDO功能
前言 关于VDO VDO的技术来源于收购的Permabit公司,一个专门从事重删技术的公司,所以技术可靠性是没有问题的 VDO是一个内核模块,目的是通过重删减少磁盘的空间占用,以及减少复制带宽,VDO ...
- 3-colorability
目录 1.1 3-colorability 1.1.1 3元可满足规约到3着色 1.1.2 证明充分和必要性 1.1 3-colorability 一个图的三着色问题:要使得边两头的结点颜色互不相同. ...
- 单核cpu多线程有必要吗?
问题分析 现代计算机一般都是多核cpu,多线程的可以大大提高效率,但是可能会有疑问,那单核CPU使用多线程是不是没有必要了,假定一种情况,web应用服务器,单核CPU.单线程,用户发过来请求,单个线程 ...
- [原题复现]ByteCTF 2019 –WEB- Boring-Code[无参数rce、绕过filter_var(),等]
简介 原题复现: 考察知识点:无参数命令执行.绕过filter_var(), preg_match() 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使 ...
- jsonp和普通的ajax区别
1.请求类型.返回类型不一样 2.返回数据类型
- java开发两年,连Spring中bean的装配都不知道?你怎么涨薪啊
Spring 1.1.1.1 创建一个bean package com.zt.spring; public class MyBean { private String userName; privat ...
- BT下载器Folx标签功能怎么实现自动的资源分类
很多经典的电影作品,比如魔戒三部曲.蜘蛛侠系列.漫威动画系列等,在一个系列中都会包含多个作品.如果使用Folx bt种子下载器自带的电影标签的话,会将这些系列电影都归为"电影"标签 ...
- 关于Camtasia2020安装完成之后无法运行问题的解决方法
在录像编辑软件Cmtasia更新到了2020版本之后,有部分小伙伴们遇到了这样的问题:在我们安装好软件之后,居然无法运行.今天小编就给大家介绍一下该如何解决这个问题. 方法一: 第一步,选中桌面上Ca ...
- FL Studio中如何使用插件混杂功能中的琶音器
琶音指一串和弦音从低到高或从高到低依次连续奏出,可视为分解和弦的一种.通常作为一种专门的技巧训练用于练习曲中,有时作为短小的连接句或经过句出现在乐曲旋律声部中.在Trance类型电子音乐中,琶音的运用 ...
- 鱼骨图是什么?怎么用iMindMap画鱼骨图?
鱼骨图是一种发现问题"根本原因"的方法,它也可以称之为"因果图".其特点是简捷实用,深入直观."鱼头"处标注的一般是问题或后果.按出现机会多 ...