洛谷 - P4449 - 于神之怒加强版 - 莫比乌斯反演
https://www.luogu.org/problemnew/show/P4449
\(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{i=1}^{m} gcd(i,j)^k\)
首先加方括号,枚举g,提g:(\(min\)表示\(min(n,m)\))
\(\sum\limits_{g=1}^{min} g^k \sum\limits_{i=1}^{n} \sum\limits_{i=1}^{m} [gcd(i,j)==g]\)
\(\sum\limits_{g=1}^{min} g^k \sum\limits_{i=1}^{\lfloor\frac{n}{g}\rfloor} \sum\limits_{i=1}^{\lfloor\frac{m}{g}\rfloor} [gcd(i,j)==1]\)
后面莫比乌斯反演:(k被你用了真恶心)
\(\sum\limits_{g=1}^{min} g^k \sum\limits_{x=1}^{min} \mu(x){\lfloor\frac{n}{gx}\rfloor} {\lfloor\frac{m}{gx}\rfloor}\)
众所周知,这种情况要枚举\(T=gx\):
\(\sum\limits_{T=1}^{min}\sum\limits_{g|T} g^k \mu(\frac{T}{g}) {\lfloor\frac{n}{T}\rfloor} {\lfloor\frac{m}{T}\rfloor}\)
提T:
\(\sum\limits_{T=1}^{min} {\lfloor\frac{n}{T}\rfloor} {\lfloor\frac{m}{T}\rfloor} \sum\limits_{g|T} g^k \mu(\frac{T}{g})\)
所以:
\(F(n)=\sum\limits_{i=1}^{n}\sum\limits_{i=1}^{m} gcd(i,j)^k = \sum\limits_{T=1}^{min} {\lfloor\frac{n}{T}\rfloor} {\lfloor\frac{m}{T}\rfloor} \sum\limits_{g|T} g^k \mu(\frac{T}{g})\)
\(n,m\)这么小那我给你搞个线性筛吧。记 \(G(n)=\sum\limits_{g|n} g^k \mu(\frac{n}{g})\) ,这个可以 \(O(nlogn)\) 筛出来。但是我偏偏要线性筛。
每次回答一个分块了事了。
小心取模,靠。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read() {
int x=0;
char c=getchar();
while(c<'0'||c>'9')
c=getchar();
do {
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
} while(c>='0'&&c<='9');
return x;
}
inline void write(ll x) {
if(x>9) {
write(x/10);
}
putchar(x%10+'0');
return;
}
const int MAXN=5e6;
const int MOD=1e9+7;
int pri[MAXN+1];
int &pritop=pri[0];
ll G[MAXN+1];
int pk[MAXN+1];
int k;
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;
}
void sieve(int n=MAXN) {
pk[1]=1;
G[1]=1;
for(int i=2; i<=n; i++) {
if(!pri[i]) {
pri[++pritop]=i;
pk[i]=i;
G[i]=qpow(i,k)-1ll;
if(G[i]<0)
G[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]=pk[p];
//积性函数
G[t]=G[i]*G[p];
if(G[t]>=MOD)
G[t]%=MOD;
} else {
pk[t]=pk[i]*p;
if(pk[t]==t) {
//t是质数的幂次
G[t]=qpow(p,k)*G[i];
if(G[t]>=MOD)
G[t]%=MOD;
} else {
//积性函数
G[t]=G[pk[t]]*G[t/pk[t]];
if(G[t]>=MOD)
G[t]%=MOD;
}
break;
}
}
}
for(int i=1;i<=n;i++){
G[i]+=G[i-1];
if(G[i]>=MOD)
G[i]-=MOD;
}
}
inline ll ans(int n,int m) {
ll res=0;
int N=min(n,m);
for(int l=1,r;l<=N;l=r+1){
r=min(n/(n/l),m/(m/l));
ll tmp1=1ll*(n/l)*(m/l);
if(tmp1>=MOD)
tmp1%=MOD;
ll tmp2=G[r]-G[l-1];
if(tmp2<0)
tmp2+=MOD;
tmp1*=tmp2;
if(tmp1>=MOD)
tmp1%=MOD;
res+=tmp1;
if(res>=MOD)
res%=MOD;
}
return res;
}
inline void solve() {
int t=read();
k=read();
sieve();
while(t--) {
int n=read(),m=read();
write(ans(n,m));
putchar('\n');
}
}
int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
solve();
return 0;
}
洛谷 - P4449 - 于神之怒加强版 - 莫比乌斯反演的更多相关文章
- 【BZOJ-4407】于神之怒加强版 莫比乌斯反演 + 线性筛
4407: 于神之怒加强版 Time Limit: 80 Sec Memory Limit: 512 MBSubmit: 241 Solved: 119[Submit][Status][Discu ...
- BZOJ 4407 于神之怒加强版 (莫比乌斯反演 + 分块)
4407: 于神之怒加强版 Time Limit: 80 Sec Memory Limit: 512 MBSubmit: 1067 Solved: 494[Submit][Status][Disc ...
- 洛谷 P5518 - [MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题(莫比乌斯反演+整除分块)
洛谷题面传送门 一道究极恶心的毒瘤六合一题,式子推了我满满两面 A4 纸-- 首先我们可以将式子拆成: \[ans=\prod\limits_{i=1}^A\prod\limits_{j=1}^B\p ...
- 洛谷P2257 YY的GCD 莫比乌斯反演
原题链接 差不多算自己推出来的第一道题QwQ 题目大意 \(T\)组询问,每次问你\(1\leqslant x\leqslant N\),\(1\leqslant y\leqslant M\)中有多少 ...
- BZOJ4407 于神之怒加强版 - 莫比乌斯反演
题解 非常裸的莫比乌斯反演. 但是反演完还需要快速计算一个积性函数(我直接用$nlogn$卷积被TLE了 推荐一个博客 我也不想再写一遍了 代码 #include<cstring> #in ...
- [洛谷P1390]公约数的和·莫比乌斯反演
公约数的和 传送门 分析 这道题很显然答案为 \[Ans=\sum_{i=1}^n\sum_{j=i+1}^n (i,j)\] //其中\((i,j)\)意味\(gcd(i,j)\) 这样做起来很烦, ...
- 【bzoj4407】于神之怒加强版 莫比乌斯反演+线性筛
题目描述 给下N,M,K.求 输入 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示. 输出 如题 ...
- 【BZOJ4407】于神之怒加强版 莫比乌斯反演
[BZOJ4407]于神之怒加强版 Description 给下N,M,K.求 Input 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行, ...
- 洛谷 - SP3871 GCDEX - GCD Extreme - 莫比乌斯反演
易得 $\sum\limits_{g=1}^{n} g \sum\limits_{k=1}^{n} \mu(k) \lfloor\frac{n}{gk}\rfloor \lfloor\frac{n}{ ...
随机推荐
- Python标准库:内置函数set([iterable])
本函数是从迭代对象生成集合.集合能够添加或删除元素. 样例: #set() tset = set([1, 2, 3, 3, 4, 5, 6, 6]) print(tset) tset.add(20) ...
- 自定义 spinner
http://blog.sina.com.cn/s/blog_3e333c4a010151cj.html
- 【BZOJ1064】[Noi2008]假面舞会 DFS树
[BZOJ1064][Noi2008]假面舞会 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择 ...
- Hibernate中的Sesson操作
一.Session概述 Session是应用程序与数据库之间的一个会话,是Hibernate运作的中心,持久层操作的基础,相当于JDBC中的Connection.Session对象是通过Session ...
- MongoDB——mongo-connector同步到ES
1.搭建完毕MongoDb复制集环境 2.开始安装 mongo-connector pip install mongo-connector:基于pip命令,不管是linux .window 系统默认有 ...
- Linux常用命令——持续更新(2018-05-09)
此命令默认是在centos环境下执行,除非特殊标明. 1.查看ip: ifconfig 2.创建指定用户并分配到某个组:创建用户user并分配到root组 useradd -g root user 3 ...
- 最新版本号MYSQL官网下载地址可是必需要注冊后才干下载
因mysql5.0上运行函数不行,决定安装最新版本号的mysql,在网上找了些绿色版的.安装总报1067错误,网上的各种方法都试了,就是不行.浪费时间不说.郁闷死了,最后决定去官网,官 ...
- android中样式和自定义button样式
1)自定义button样式 一.采用图片方式 首先新建Android XML文件,类型选Drawable,根结点选selector,自定义一个文件名. 随后,开发环境自动在新建的文件里加了select ...
- linux内核驱动中对文件的读写 【转】
本文转载自:http://blog.chinaunix.net/uid-13059007-id-5766941.html 有时候需要在Linux kernel--大多是在需要调试的驱动程序--中读写文 ...
- BZOJ1086 王室联邦 —— 树分块
题目链接:https://vjudge.net/problem/HYSBZ-1086 1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 16 ...