题面

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\)。


正解

先莫反操作一发:

\[\begin{split}
&\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)(1)=1\\
(\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的更多相关文章

  1. 3.26-3.31【cf补题+其他】

      计蒜客)翻硬币 //暴力匹配 #include<cstdio> #include<cstring> #define CLR(a, b) memset((a), (b), s ...

  2. 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 ...

  3. 【题解】 CF11D A Simple Task

    [题解] CF11D A Simple Task 传送门 \(n \le 20\) 考虑状态压缩\(dp\). 考虑状态,\(dp(i,j,O)\)表示从\(i\)到\(j\)经过点集\(O\)的路径 ...

  4. Codeforces 959F Mahmoud and Ehab and yet another xor task 线性基 (看题解)

    Mahmoud and Ehab and yet another xor task 存在的元素的方案数都是一样的, 啊, 我好菜啊. 离线之后用线性基取check存不存在,然后计算答案. #inclu ...

  5. [CF11D]A Simple Task 题解

    题解 我们从最简单的思路开始考虑,首先看到题目发现\(n\)非常小,于是很容易想到状态压缩. 我们考虑比较直觉的状态,f[i][j][k]表示以i为起点,当前在j,之前去过的点状态为k的简单环的方案数 ...

  6. [LeetCode]621. Task Scheduler 任务安排 题解

    题目描述 给定一个char数组,代表CPU需要做的任务,包含A-Z,不用考虑顺序,每个任务能在1个单位完成.但是有规定一个非负整数n代表两个相同任务之间需要至少n个时间单位.球最少数量的时间单位完成所 ...

  7. HDU 3974 Assign the task(DFS序)题解

    题意:给出一棵树,改变树的一个节点的值,那么该节点及所有子节点都变为这个值.给出m个询问. 思路:DFS序,将树改为线性结构,用线段树维护.start[ ]记录每个节点的编号,End[ ]为该节点的最 ...

  8. 题解报告:hdu 4907 Task schedule

    Problem Description 有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务.有m个询问,每个询问有一个数字q,表示如果在q时间 ...

  9. CF 11D A Simple Task 题解

    题面 这道题的数据范围一看就是dfs或状压啦~ 本文以状压的方式来讲解 f[i][j]表示目前的节点是i,已经经历过的节点的状态为j的简单环的个数: 具体的转移方程和细节请看代码: PS:(i& ...

随机推荐

  1. shell编程之awk

    awk是一种用于处理数据和生成报告的编程语言 awk可以在命令行中进行一些简单的操作,也可以被写成脚本来处理较大的应用问题 awk与grep.sed结合使用,将使shell编程更加容易 awk工作模式 ...

  2. 使用IDEA推送项目至gitee平台或github平台

    IDEA项目推送至gitee平台或github平台 1.首先在gitee平台上创建项目 在gitee平台上创建仓库应该很简单,依据下图所示填写相应信息,即可完成创建. 需要说明的一点是,现在java开 ...

  3. 使用XSL解析XML输出HTML(XSL学习笔记一)

    最近项目用到 XSL + XML,XML大家应该很熟悉,XSL暂且不解释,先看效果,如果想学习XSL的内容,可以先访问: https://www.w3school.com.cn/xsl/xsl_lan ...

  4. HTML5大纲算法

    什么是HTML大纲算法? 大纲算法允许用户代理(user agent)从一个web页面生成一个信息结构目录,让用户对页面有一个快速的概览.类似书籍.PDF.帮助文档等,都有一个清晰的目录结构,用户能方 ...

  5. 「LOJ 538」「LibreOJ NOIP Round #1」数列递推

    description sosusosu 虐爆 OI 之后成为了一名文化课选手.一天,他做作业碰到了一堆数列问题,每道题给出的数列都是以下形式: 给定一个下标从\(0\)开始,无限长的整数列\({a_ ...

  6. 「LOJ 3153」 「JOI Open 2019」三级跳

    题面 LOJ 3153 solution 对于任意一对\(A,B\),若区间\([A,B]\)中存在一个数权值大于\(A\)或\(B\),则用这个数来替代\(A\)或\(B\)显然更优. 故只需要考虑 ...

  7. docker和k8s的概念-IaaS、PaaS、SaaS 的区别

    docker和k8s 参考: 什么是Docker? Kubernetes概述 openstack,docker,mesos,k8s什么关系? IaaS.PaaS.SaaS的概念 SaaS:软件服务,S ...

  8. AcWing 298. 围栏 (POJ1821)

    标签(空格分隔): dp 单调队列优化 题目描述 有N块木板从左到右排成一行,有M个工匠对这些木板进行粉刷,每块木板至多被粉刷一次. 第 i 个木匠要么不粉刷,要么粉刷包含木板 \(S_i\) 的,长 ...

  9. 【操作系统】先来先服务和短作业优先算法(C语言实现)

    [操作系统] 先来先服务算法和短作业优先算法实现 介绍: 1.先来先服务 (FCFS: first come first service) 如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列 ...

  10. [BUGCASE]前端码案概述

    中医有医案之说,程序会出bug,因此想到将自己在项目中遇到的疑难bug记录下来的想法,出于以下目的: 沉淀经验 通过问题学习 训练解决问题的能力 训练文档写作能力 取名:码案(Bug Case). 医 ...