SCUT - 114 - 作业之数学篇 - 杜教筛
\(A(n)=\sum\limits_{i=1}^{n} \frac{lcm(i,n)}{gcd(i,n)}\)
\(=\sum\limits_{i=1}^{n} \frac{in}{gcd^2(i,n)}\)
枚举g:
\(A(n)=n\sum\limits_{g|n}\frac{1}{g^2} \sum\limits_{i=1}^{n} i [gcd(i,n)==g]\)
最内层除以g:
\(A(n)=n\sum\limits_{g|n}\frac{1}{g} \sum\limits_{i=1}^{\frac{n}{g}} i [gcd(i,\frac{n}{g})==1]\)
考虑里面的:
\(B(n)=\sum\limits_{i=1}^{n} i [gcd(i,n)==1]\)
显然:
\(B(n)=\frac{1}{2}n([n==1]+\varphi(n))\)
代回 \(A(n)\) 里面:
\(A(n)=\sum\limits_{g|n}\frac{n}{g} B(\frac{n}{g})\)
\(=\sum\limits_{g|n} g B(g)\)
\(=\frac{1}{2}(1+\sum\limits_{g|n} g^2 \varphi(g))\)
代回 \(S(n)\) 里面:
$S(n)=\sum\limits_{i=1}^{n} A(i) \(
\)= \sum\limits_{i=1}^{n} \frac{1}{2}(1+\sum\limits_{g|i} g^2 \varphi(g))\(
\)= \frac{n}{2}+\frac{1}{2}\sum\limits_{i=1}^{n}\sum\limits_{g|i} g^2 \varphi(g)$
记:
\(C(n)=\sum\limits_{i=1}^{n}\sum\limits_{g|i} g^2 \varphi(g)\)
显然:
\(C(n)=\sum\limits_{d=1}^{n}d^2 \varphi(d) \lfloor\frac{n}{d}\rfloor\)
后面是一个分块,前面是个杜教筛。然后我们召唤鹏哥就可以通过这道题了。
转化为快速求 $\sum\limits_{i=1}^{n} i^2 \varphi(i) $,卷一个id平方然后查鹏哥的cheatsheet过了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int inv2=(mod+1)>>1;
const int MAXN=4e6;
int pri[MAXN+1];
int &pritop=pri[0];
ll B[MAXN+1];
ll PrefixB[MAXN+1];
int pk[MAXN+1];
void sieve(int n=MAXN) {
pk[1]=1;
B[1]=1;
for(int i=2; i<=n; i++) {
if(!pri[i]) {
pri[++pritop]=i;
pk[i]=i;
ll tmp=1ll*i*i;
//.
if(tmp>=mod)
tmp%=mod;
B[i]=tmp*(i-1);
if(B[i]>=mod)
B[i]%=mod;
//.
}
for(int j=1; j<=pritop; j++) {
int &p=pri[j];
int t=i*p;
//.
if(t>n)
break;
pri[t]=1;
if(i%p) {
pk[t]=p;
B[t]=B[i]*B[p];
if(B[t]>=mod)
B[t]%=mod;
//.
} else {
pk[t]=pk[i]*p;
if(pk[t]==t) {
ll tmp=1ll*t*t;
if(tmp>=mod)
tmp%=mod;
B[t]=tmp*(t-i);
if(B[t]>=mod)
B[t]%=mod;
//.
} else {
B[t]=B[t/pk[t]]*B[pk[t]];
if(B[t]>=mod)
B[t]%=mod;
}
break;
}
}
}
for(int i=1; i<=n; i++) {
PrefixB[i]=PrefixB[i-1]+B[i];
if(PrefixB[i]>=mod)
PrefixB[i]-=mod;
}
}
inline int phi(int n) {
int res=n;
for(int i=1; i<=pritop&&pri[i]*pri[i]<=n; i++) {
if(n%pri[i]==0) {
res-=res/pri[i];
while(n%pri[i]==0)
n/=pri[i];
}
if(n==1)
return res;
}
res-=res/n;
return res;
//.
}
inline ll qpow(ll x,int n) {
ll res=1;
while(n) {
if(n&1) {
res*=x;
if(res>=mod)
res%=mod;
}
x*=x;
if(x>=mod)
x%=mod;
n>>=1;
}
return res;
}
int inv4=qpow(4,mod-2);
int inv6=qpow(6,mod-2);
inline ll s2(ll n) {
ll tmp=n*(n+1);
if(tmp>=mod)
tmp%=mod;
tmp*=(n*2+1);
if(tmp>=mod)
tmp%=mod;
tmp*=inv6;
if(tmp>=mod)
tmp%=mod;
return tmp;
}
inline ll s3(ll n) {
ll tmp=n*(n+1);
if(tmp>=mod)
tmp%=mod;
tmp*=tmp;
if(tmp>=mod)
tmp%=mod;
tmp*=inv4;
if(tmp>=mod)
tmp%=mod;
return tmp;
}
unordered_map<int,ll> PB;
inline ll S(int n) {
if(n<=MAXN)
return PrefixB[n];
if(PB.count(n))
return PB[n];
ll ret=s3(n);
for(int l=2,r; l<=n; l=r+1) {
int t=n/l;
r=n/t;
ll tmp=s2(r)-s2(l-1);
if(tmp<0)
tmp+=mod;
tmp*=S(t);
if(tmp>=mod)
tmp%=mod;
ret-=tmp;
if(ret<0)
ret+=mod;
}
return PB[n]=ret;
}
inline ll Prefix(int l,int r) {
l--;
ll PL=S(l);
ll PR=S(r);
ll res=PR-PL;
if(res<0)
res+=mod;
return res;
}
inline ll P(int n) {
ll res=0;
for(int l=1,r; l<=n; l=r+1) {
int t=n/l;
r=n/t;
ll tmp=1ll*t*Prefix(l,r);
if(tmp>=mod)
tmp%=mod;
res+=tmp;
if(res>=mod)
res-=mod;
}
return res;
}
inline ll Ans(int n) {
ll res=(1ll*n*inv2)%mod;
res+=(P(n)*inv2)%mod;
return res%mod;
}
int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
sieve();
int n;
while(~scanf("%d",&n)) {
printf("%lld\n",Ans(n));
}
return 0;
}
SCUT - 114 - 作业之数学篇 - 杜教筛的更多相关文章
- SCUT - 354 - CC的简单多项式 - 杜教筛
https://scut.online/p/354 跟多项式一点关系都没有. 注意到其实两个多项式在1处求值,那么就是他们的系数加起来. 列一列发现系数就是n以内两两求gcd的值,还自动把0去掉了. ...
- 51Nod 1238 - 最小公倍数之和 V3(毒瘤数学+杜教筛)
题目 戳这里 推导 ∑i=1n∑j=1nlcm(i,j)~~~\sum_{i=1}^{n}\sum_{j=1}^{n}lcm(i,j) ∑i=1n∑j=1nlcm(i,j) =∑i=1n∑j= ...
- 杜教筛进阶+洲阁筛讲解+SPOJ divcnt3
Part 1:杜教筛进阶在了解了杜教筛基本应用,如$\sum_{i=1}^n\varphi(i)$的求法后,我们看一些杜教筛较难的应用.求$\sum_{i=1}^n\varphi(i)*i$考虑把它与 ...
- hihocoder #1456 : Rikka with Lattice(杜教筛)
hihocoder #1456 : Rikka with Lattice(杜教筛) 题意 : 给你一个\(n*m\)方格图,统计上面有多少个格点三角形,除了三个顶点,不覆盖其他的格点(包括边和内部). ...
- 卷积 & 杜教筛
目录 卷积 杜教筛 前言:发现最近都没怎么写博客,,,赶紧发篇以前记的笔记凑凑数 卷积 卷积定义: 如果有数论函数\(f, g\), 那么它们卷积的第\(n\)项为\((f * g) (n)\),设这 ...
- 【CCPC-Wannafly Winter Camp Day3 (Div1) F】小清新数论(莫比乌斯反演+杜教筛)
点此看题面 大致题意: 让你求出\(\sum_{i=1}^n\sum_{j=1}^n\mu(gcd(i,j))\). 莫比乌斯反演 这种题目,一看就是莫比乌斯反演啊!(连莫比乌斯函数都有) 关于莫比乌 ...
- 【知识总结】线性筛_杜教筛_Min25筛
首先感谢又强又嘴又可爱脸还筋道的国家集训队(Upd: WC2019 进候选队,CTS2019 不幸 rk6 退队)神仙瓜 ( jumpmelon ) 给我讲解这三种筛法~~ 由于博主的鸽子属性,这篇博 ...
- Mobius 反演与杜教筛
积性函数 积性函数 指对于所有互质的整数 aaa 和 bbb 有性质 f(ab)=f(a)f(b)f(ab)=f(a)f(b)f(ab)=f(a)f(b) 的数论函数. 特别地,若所有的整数 aaa ...
- 2019年南京网络赛E题K Sum(莫比乌斯反演+杜教筛+欧拉降幂)
目录 题目链接 思路 代码 题目链接 传送门 思路 首先我们将原式化简: \[ \begin{aligned} &\sum\limits_{l_1=1}^{n}\sum\limits_{l_2 ...
随机推荐
- Attempting to write a row[5] in the range [0,394] that is already written to disk.
我用POI操作excel写数据,然后就报这个错了 XSSFWorkbook workbook = new XSSFWorkbook(); SXSSFWorkbook sxssfWorkbook = n ...
- vim 插件: ctrlp.vim
vim-scripts 里可以搜到这个插件. 安装好了之后,在 vim 的 normal 模式之下按 Ctrl+P 组合键即可弹出搜索窗口. * <f5> 更新目录缓存. * <c- ...
- POJ 2263 Heavy Cargo(ZOJ 1952)
最短路变形或最大生成树变形. 问 目标两地之间能通过的小重量. 用最短路把初始赋为INF.其它为0.然后找 dis[v]=min(dis[u], d); 生成树就是把最大生成树找出来.直到出发和终点能 ...
- WIN7系统设置wifi
*&->20170302 112700 WIN7系统设置wifi, 开启win7的隐藏功能,即虚拟wifi功能和虚拟无线AP功能,即可实现将电脑变成wifi 供无线上网, 1.开始-命令 ...
- wireshark 学习 2
使用wireshark抓到的wifi数据包如果是加密的,就只能显示密文,无法得到真正的数据. 如果知道AP和SSID和key,就可以解密wifi数据包,显示上层协议的数据. 在wireshark中设置 ...
- Python 参数校验的进化
Python 函数参数魔法 事情的起因是感觉目前项目中的参数校验方法写的太简单了,很多时候需要在server层再if else处理,于是就动手准备写一个好用一点的,可以自定义校验参数规则的参数校验器, ...
- POj 3253 Fence Repair(修农场栅栏,锯木板)(小根堆 + 哈弗曼建树得最小权值思想 )
Fence Repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 28359 Accepted: 9213 Des ...
- 模仿yui将css和js打包,加速网页速度
如果你有机会用firebug看看自己网站的网络请求,你会发现请求数量之多超乎你的想象.为减少这个数量,有许多技术方案.比如yui的combo,会将所有需要的js混合成一个文件下载,现代web服务器好像 ...
- codeforces 460C. Present 解题报告
题目链接:http://codeforces.com/submissions/ywindysai 题目意思:有 n 朵花,每朵花都有一定的高度(第 i 朵花对应 ai),m 天之后要把这些花送给别人. ...
- Tensorflow深度学习之十二:基础图像处理之二
Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474 首先放出原始图像: ...