BZOJ 4407 于神之怒加强版

题目链接:于神之怒加强版

  这个式子还是很妙的,只是我已经思维僵化了

\begin{aligned}
 &\sum_{i=1}^n\sum_{j=1}^m\gcd(i,j)^k \\
=&\sum_{g=1}^ng^k\sum_{i=1}^{\lfloor \frac{n}{g} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{g} \rfloor}\sum_{d|i,d|j}\mu(d) \\
=&\sum_{g=1}^ng^k\sum_{d=1}^{\lfloor \frac{n}{g} \rfloor}\mu(d)\lfloor \frac{n}{dg} \rfloor\lfloor \frac{m}{dg} \rfloor \\
=&\sum_{g=1}^ng^k\sum_{g|x}^{n}\mu(\frac{x}{g}) \lfloor \frac{n}{x} \rfloor\lfloor \frac{m}{x} \rfloor \\
=&\sum_{x=1}^n \lfloor \frac{n}{x} \rfloor\lfloor \frac{m}{x} \rfloor  \sum_{g|x} g^k \mu(\frac{x}{g})
\end{aligned}

  然后我们可以令\(f(x)=\sum_{g|x} g^k \mu(\frac{x}{g})\),显然\(f(x)\)是\(id^k\)与\(\mu\)的狄利克雷卷积,所以\(f(x)\)也是一个积性函数

  由于\(n\)的范围有\(5\times 10^6\),所以我们来考虑一下如何筛这个\(f\)函数,也就是考虑在\(i\)是\(p\)的倍数的情况下计算\(f(ip)\)(\(p\)为质数)

  令\(i=p^kq(q\perp p)\),然后分情况讨论一下:

  当\(q\ne 0\)时,由于\(i\)的最小质因子为\(p\),那么\(p^{k+1}<i\),所以\(f(\frac{i}{p^k})\times f(p^{k+1})\)就是所求;

  当\(q=0\)时,由于\(f(p^x)=p^{kx}-p^{kx-k}\),所以\(f(i)\times p^k\)即为所求,\(p^k\)则可以通过预处理所有质数的\(k\)次方解决。

  最后再分块计算就好了。

  下面贴代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 5000010
#define mod 1000000007

using namespace std;
typedef long long llg;

int T,k,n,m,pr[maxn],lp;
int g[maxn],c[maxn];
bool vis[maxn];
llg f[maxn];

void gi(llg &x){if(x>=mod) x%=mod;}
llg mi(llg a,int b){
	llg s=1;
	while(b){
		if(b&1) s=s*a,gi(s);
		a=a*a,gi(a); b>>=1;
	}
	return s;
}

int main(){
	File("a");
	scanf("%d %d",&T,&k); f[1]=c[1]=1;
	for(int i=2;i<maxn;i++){
		if(!vis[i]) pr[++lp]=i,g[i]=i,c[i]=mi(i,k),f[i]=c[i]-1;
		for(int j=1;i*pr[j]<maxn;j++){
			if(i*pr[j]==31823){
				int aa;
				aa++;
			}
			vis[i*pr[j]]=1;
			if(i%pr[j]) g[i*pr[j]]=pr[j],f[i*pr[j]]=f[i]*f[pr[j]]%mod;
			else{
				f[i*pr[j]]=g[i]!=i?f[i/g[i]]*f[g[i]*pr[j]]:f[i]*c[pr[j]];
				gi(f[i*pr[j]]); g[i*pr[j]]=g[i]*pr[j]; break;
			}
		}
	}
	for(int i=2;i<maxn;i++) f[i]+=f[i-1],gi(f[i]);
	while(T--){
		scanf("%d %d",&n,&m);
		if(n>m) n^=m^=n^=m;
		llg ans=0;
		for(int i=1,nt;i<=n;i=nt+1){
			nt=min(n/(n/i),m/(m/i));
			ans+=(f[nt]-f[i-1]+mod)*(n/i)%mod*(m/i)%mod;
			if(ans>=mod) ans%=mod;
		}
		printf("%lld\n",ans);
	}
	return 0;
}
时间: 2024-08-25 19:50:39

BZOJ 4407 于神之怒加强版的相关文章

bzoj 4407 于神之怒加强版 (反演+线性筛)

于神之怒加强版 Time Limit: 80 Sec  Memory Limit: 512 MBSubmit: 1184  Solved: 535[Submit][Status][Discuss] Description 给下N,M,K.求 Input 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示. Output 如题 Sample Input 1 2 3 3 Sample Output 20

●BZOJ 4407 于神之怒加强版

题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4407 题解: 莫比乌斯反演 直接套路化式子 $\begin{align*}ANS&=\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)^k(接下来先枚举gcd的值g,然后求出有多少对(i,j)的gcd=g) \\&=\sum_{g=1}^{min(n,m)}g^k\sum_{d=1}{\frac{n}{g}\mu(d)\lfloor \frac{n}{gd} \

bzoj 4407 于神之怒加强版 —— 反演+筛积性函数

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4407 推导如这里:https://www.cnblogs.com/clrs97/p/5191506.html 然后发现 \( F(D) \) 是一个积性函数,可以筛质数的同时筛出来: 首先,单个质数 \( p \) 时只有 \( d=1 \) 和 \( d=p \) 两个因数,所以 \( F[p] = p^{k} - 1 \) 然后如果筛到互质的数,直接把 \( F() \) 相乘即可:

BZOJ4407: 于神之怒加强版

4407: 于神之怒加强版 Time Limit: 80 Sec  Memory Limit: 512 MBSubmit: 779  Solved: 368[Submit][Status][Discuss] Description 给下N,M,K.求 Input 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示. Output 如题 Sample Input 1 2 3 3 Sample Outp

【BZOJ4407】于神之怒加强版(莫比乌斯反演)

[BZOJ4407]于神之怒加强版(莫比乌斯反演) 题面 BZOJ 求: \[\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)^k\] 题解 根据惯用套路 把公约数提出来 \[\sum_{d=1}^nd^k\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==d]\] 再提一次 \[\sum_{d=1}^nd^k\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[gcd(i,j)==1]\] 后面这个东西很显然可以数论分块+莫比乌斯反演做到\(O(\

【bzoj 4407】于神之怒加强版

Description 给下N,M,K.求 Input 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示. Output 如题 Sample Input 1 2 3 3 Sample Output 20 HINT 1<=N,M,K<=5000000,1<=T<=2000 题解: (建议调一下缩放,博客园的数学公式正常缩放看起来比较恶心……) $ans=\sum_{i=1}^{n}\s

bzoj 3551: [ONTAK2010]Peaks加强版

Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来Q行,每行三个数v x k,表示一组询问.v=v xor lastans,x=x xor lastans,k=k xor lastans.如果lastans=-1则不变. Output 同3545 Sample Input Sample Output HINT [数据范围]同3545 Source

BZOJ 3265 志愿者招募加强版 单纯形

题目大意:同1061 不过每类志愿者能工作的区间是多段 这是卡网络流?不明 总之把1061稍微改改就能过了- - #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define INF 1e10 #define EPS 1e-7 using namespace std; int m,n; namespace

BZOJ 3085: 反质数加强版SAPGAP (反素数搜索)

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3085 题意:求n(<=10^100)之内最大的反素数. 思路: 优化2: int prime[]= { 1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101,103,107,109, 113,127,131,137,139, 14