ABC162 E - Sum of gcd of Tuples (Hard)

E - Sum of gcd of Tuples (Hard)

题意

a 1 = 1 K a 2 = 1 K . . . a N = 1 K g c d ( a 1 , a 2 , . . . , a N )   ( m o d 1 e 9 + 7 ) \sum_{a_{1}=1}^{K} \sum_{a_{2}=1}^{K}...\sum_{a_{N}=1}^{K} gcd(a_{1},a_{2},...,a_{N}) ~(mod 1e9+7)

思路

  1. 莫比乌斯反演(不会可以参考zdragon
  2. 简单容斥

这里讲一下简单容斥的做法吧因为笔者目前还不会莫比乌斯反演
f [ i ] f[i] 为以 i i g c d gcd 的个数,枚举 i i f [ i ] = k i n f [ i 2 ] f [ i 3 ] . . . f [ ( i t ) ( < = n ) ] f[i]=\lfloor\frac{k}{i}\rfloor^n-f[i*2]-f[i*3]...-f[(i*t)(<=n)]
f [ i ] = K i N j > i , i j f [ j ] f[i]={\lfloor \frac{K}{i}\rfloor}^{N}-\sum_{j>i,i|j}f[j]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 1e9 + 7;
const ll  maxn = 1e6 + 5;
const int N = 1e5 + 5;

long long n,k,f[N];

ll power(ll a,ll b){return b?power(a*a%mod,b/2)*(b%2?a:1)%mod:1;}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>k;
	ll ans=0;
	for(int i=k;i>=1;i--){
		f[i]=power(k/i,n);
		for(int j=2*i;j<=k;j+=i) f[i]-=f[j];
		ans=(ans+i*f[i]%mod)%mod;//大小×个数才是该数所有的和
	}
	cout<<(ans+mod)%mod<<'\n';
	return 0;
}
发布了89 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Meulsama/article/details/105491351