【BZOJ4407】于神之怒加强版
题面
题目分析
\sum\limits_{i=1}^n\sum\limits_{j=1}^mgcd(i,j)^k&=\sum\limits_{d=1}^nd^k\sum\limits_{i=1}^n\sum\limits_{j=1}^m[gcd(i,j)==d]\\
\end{split}
\]
设\(f(x)\)表示\(gcd(i,j)=x\),\(g(x)\)表示\(gcd(i,j)==kx,k\in Z\)。
g(x)&=\sum\limits_{x|d}^nf(d)\\
&=\sum\limits_{i=1}^n\sum\limits_{j=1}^m[x|gcd(i,j)]\\
&=\sum\limits_{i=1}^{\lfloor\frac n x\rfloor}\sum\limits_{j=1}^{\lfloor\frac m x\rfloor}\lfloor\frac n x\rfloor\lfloor\frac m x\rfloor\\
f(x)&=\sum\limits_{x|d}^n\mu(\frac dx)g(d)=\sum\limits_{x|d}^n\mu(\frac dx)\lfloor\frac n d\rfloor\lfloor\frac m d\rfloor
\end{split}
\]
ans&=\sum\limits_{d=1}^nd^k\cdot f(d)\\
&=\sum\limits_{d=1}^nd^k\sum\limits_{d|T}^n\mu(\frac Td)\lfloor\frac n T\rfloor\lfloor\frac m T\rfloor\\
&=\sum\limits_{T=1}^n\lfloor\frac n T\rfloor\lfloor\frac m T\rfloor\sum\limits_{d|T}\mu(\frac Td)d^k
\end{split}
\]
由于\(\mu\)和\(d^k\)均为积性函数,所以\(\sum\limits_{d|T}\mu(\frac Td)d^k\)也为积性函数,可以在线性筛中\(O(n\log n)\)预处理。
前面部分用整除分块加速。
代码实现
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#define MAXN 0x7fffffff
typedef long long LL;
const int N=5000005,mod=1e9+7;
using namespace std;
inline int Getint(){register int x=0,f=1;register char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}return x*f;}
int g[N],mu[N],prime[N];
bool vis[N];
LL ksm(LL x,LL k){
LL ret=1;
while(k){
if(k&1)ret=ret*x%mod;
x=x*x%mod;
k>>=1;
}
return ret;
}
int low[N];
int main(){
int T=Getint(),K=Getint();
mu[1]=g[1]=1;
for(int i=2;i<=5e6;i++){
if(!vis[i]){
prime[++prime[0]]=i,mu[i]=-1;
low[i]=i,g[i]=ksm(i,K)-1;
}
for(int j=1;j<=prime[0]&&1ll*prime[j]*i<=5e6;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0){
low[i*prime[j]]=low[i]*prime[j];
if(low[i*prime[j]]==i*prime[j])
g[i*prime[j]]=g[i]*ksm(prime[j],K)%mod;
else
g[i*prime[j]]=(1ll*g[low[i*prime[j]]]*g[i*prime[j]/low[i*prime[j]]])%mod;
break;
}
low[i*prime[j]]=prime[j];
g[i*prime[j]]=(1ll*g[i]*g[prime[j]])%mod;
mu[i*prime[j]]=-mu[i];
}
}
for(int i=1;i<=5e6;i++)g[i]=(g[i]+g[i-1])%mod;
while(T--){
int n=Getint(),m=Getint();
if(n>m)swap(n,m);
int ans=0;
for(int l=1,r;l<=n;l=r+1){
r=min(n/(n/l),m/(m/l));
ans=(ans+1ll*(n/l)*(m/l)%mod*(g[r]-g[l-1])%mod+mod)%mod;
}
cout<<ans<<'\n';
}
return 0;
}
【BZOJ4407】于神之怒加强版的更多相关文章
- [BZOJ4407]于神之怒加强版
BZOJ挂了... 先把程序放上来,如果A了在写题解吧. #include<cstdio> #include<algorithm> #define N 5000010 #def ...
- BZOJ4407: 于神之怒加强版(莫比乌斯反演 线性筛)
Description 给下N,M,K.求 感觉好迷茫啊,很多变换看的一脸懵逼却又不知道去哪里学.一道题做一上午也是没谁了,, 首先按照套路反演化到最后应该是这个式子 $$ans = \sum_{d ...
- BZOJ4407 于神之怒加强版 - 莫比乌斯反演
题解 非常裸的莫比乌斯反演. 但是反演完还需要快速计算一个积性函数(我直接用$nlogn$卷积被TLE了 推荐一个博客 我也不想再写一遍了 代码 #include<cstring> #in ...
- 【BZOJ4407】于神之怒加强版(莫比乌斯反演)
[BZOJ4407]于神之怒加强版(莫比乌斯反演) 题面 BZOJ 求: \[\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)^k\] 题解 根据惯用套路 把公约数提出来 \[\sum ...
- 【BZOJ4407】于神之怒加强版 莫比乌斯反演
[BZOJ4407]于神之怒加强版 Description 给下N,M,K.求 Input 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行, ...
- 【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 ...
- bzoj 4407 于神之怒加强版 (反演+线性筛)
于神之怒加强版 Time Limit: 80 Sec Memory Limit: 512 MBSubmit: 1184 Solved: 535[Submit][Status][Discuss] D ...
- 【反演复习计划】【bzoj4407】于神之怒加强版
#include<bits/stdc++.h> #define N 5000010 #define yql 1000000007 using namespace std; typedef ...
- 【bzoj4407】于神之怒加强版 莫比乌斯反演+线性筛
题目描述 给下N,M,K.求 输入 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示. 输出 如题 ...
随机推荐
- [JZOJ 5814] 树
题目:从u到v经过多少条边. 思路: 考虑他是怎么走的?? 从\(u\)到\(v\)一定是\(fa[u]\),\(fa[fa[u]]\),反正就是走\(LCA\),那么如果算出每个点到父亲的期望步数, ...
- bash数组总结
bash数组操作 bash支持两种数组,一种是索引数组,一种是关联数组 索引数组 数组的值类型是任意的,索引也未必一定要连续,当做列表理解更好 下面总结下索引数组,即列表: 1. 声明 declare ...
- jQuery 表单域选中选择器
复选框.单选按钮.下拉列表 /***********************************************/ <script type="text/javascrip ...
- class12_pack_grid_place 放置位置
其中的部分运行效果图(程序见序号1): #!/usr/bin/env python# -*- coding:utf-8 -*-# ----------------------------------- ...
- PAT_A1020#Tree Traversals
Source: PAT A1020 Tree Traversals (25 分) Description: Suppose that all the keys in a binary tree are ...
- 安装mysql时,服务无法启动的问题
1.下载mysql镜像文件:mysql-installer-community-8.0.17.0.msi 2.点击镜像进行安装,一直next即可 3.cmd以管理员身份,进入到安装的mysql安装目录 ...
- protobuf文档翻译-安装,数据格式及编码规范
Install Download protobuf: https://github.com/protocolbuffers/protobuf/releases unzip protoc-3.8.0-l ...
- vc面试题目
class B { public: B() { cout << "default constructor" << endl; } ~B() { cout & ...
- CF421D Bug in Code
题意:n个人每人选择了另外不相同的两个人.问有多少对(x,y)使得这n个人中至少有p个选择了至少其中之一? 标程:那就不写了吧. 题解:容斥 统计Ax表示有多少个人选择了x. 一般来说有Ax+Ay&g ...
- Python自学:第四章 在for循环中执行更多操作(2)
# -*- coding: GBK -*- magicians = ['alice', 'david', 'carolina'] for magician in magicians: print(ma ...