首页 > 其他分享 >【ABC162E】Sum of gcd of Tuples (Hard)

【ABC162E】Sum of gcd of Tuples (Hard)

时间:2023-02-05 17:48:17浏览次数:35  
标签:right gcd Sum Hard long Tuples left sum mod

upd on 2022-7-13: 修改若干不合适叙述。

一、题意

很明了,给出 \(n,k\),求下面这个复杂式子的值:

\[\sum_{a_1=1}^k\sum_{a_1=1}^k\cdots\sum_{a_{n-1}=1}^k\sum_{a_n=1}^k\gcd\left\{a_i\right\} \]

二、思路

一眼莫反,但是个人觉得有点小题大做。

首先我们要认识到,\(\gcd\left\{a_i\right\}\leq k\),结合 \(k\le10^5\),所以可以令 \(f_j\) 表示 \(\gcd\left\{a_i\right\}=j\) 的次数,就很好做很好想了。

如果要让 \(\gcd\left\{a_i\right\}=mj\),则 \(\forall a_i=nk\) (此处 \(n,m\) 为正整数),易得 \(\forall a_i\) 有 \(\lfloor\dfrac k j\rfloor\) 种取值,共 \(\lfloor \dfrac k i\rfloor^n\) 种可能。

注意是 \(mj\) 而不是 \(j\),此时 \(f_j\) 不是我们想要的答案,有重复,所以要去重:

for(y=x<<1;y<=k;y+=x)
	f[x]=(f[x]-f[y]+mod)%mod;

为了去重和转移的方便,倒序枚举 \(i\),复杂度 \(O\left(k\log k\log n\right)\),比莫反慢得多,但是可以忍受。

三、代码

#include <stdio.h>
const int mod=1000000007;//对1e9+7取模
long long n,k,i,x,y,ans;
long long f[100005];
long long repow(long long a,long long b){//快速幂
	long long ans=1,base=a;
	while(b){
		if(b&1)
			ans=((ans%mod)*(base%mod))%mod;
		base=((base%mod)*(base%mod))%mod;
		b>>=1;
	}
	return ans;
}
int main(){
	scanf("%lld %lld",&n,&k);
	for(x=k;x;--x){//倒序枚举
		f[x]=repow(k/x,n);
		for(y=x<<1;y<=k;y+=x)
			f[x]=(f[x]-f[y]+mod)%mod;//去重
		ans=(ans+x*f[x]%mod)%mod;//计算答案
	}
	printf("%lld",ans);//输出
	return 0;
}

标签:right,gcd,Sum,Hard,long,Tuples,left,sum,mod
From: https://www.cnblogs.com/Syara/p/17093675.html

相关文章

  • Casbin: 连续3年参加Google Summer of Code的开源授权技术领导者
    Casbin是一个开源的授权解决方案,很自豪的宣布它已经连续三年参加GoogleSummerofCode(GSoC)项目。Casbin是实现访问控制和授权管理的最受欢迎的开源项目之一。该项目广泛......
  • 【P1956】Sum
    水题,甚至比我做的很多绿都简单。也许是比较典?套路的,设数组\(b\)满足\(b_i=a_i\bmodp\)。相当于求\(b\)的在模\(p\)意义下最小大于\(k\)子段和。更加套路的,我......
  • CF1270G Subset with Zero Sum
    CF1270GSubsetwithZeroSum-洛谷|计算机科学教育新生态(luogu.com.cn)普通序列抽数,要求和为\(0\),则只能暴力搜索。那突破口肯定是\(i-n\lea_i\lei-1\)......
  • G2. Teleporters (Hard Version)
    G2.Teleporters(HardVersion)Theonlydifferencebetweentheeasyandhardversionsarethelocationsyoucanteleportto.Considerthepoints$0,1,\dots,n+1......
  • 每日一道思维题——CF1691C - Sum of Substrings
    题意:给定一个长度为n的字符串算由SiSi+1构成的子字符串值如00为0,01为1,10为10,11为11F(s)为所有值之和求出此值的最小值思路:优先将1放到最后,其次将1放在开头其余的位置......
  • checksum table t1;
    ################### mysql>checksumtablet1;+---------+-----------+|Table|Checksum|+---------+-----------+|test.t1|372885777|+---------+--......
  • java实现oracle和mysql的group by分组功能|同时具备max()/min()/sum()/case when 函数
    一、前言oracle和mysql的groupby分组功能大家应该清楚,那如何使用java实现同样的功能呢比如下面这个表idnameagemathEnglish10yujianlin2092.5103ww841025201026110363103......
  • P1466 集合 Subset Sums(01背包)
    题目描述对于从1到N(1<=N<=39)的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的。举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,每个子集合的所有数字......
  • Resume @ John-Paul Verkamp
    JP'sBlogGITHUB * FLICKR * RESUME SearchProgrammingReviewsPhotographyMakerWritingResearchRSSResume@John-PaulVerkamp https://blog.jv......
  • codeforces 595 C2. Good Numbers (hard version)
    给出Q组查询,每组给出一个N找到一个>=n的m,m可以分解成不同的3的幂次相加。可以看题意解释,就是转化为3^0,3^1,...,3^m,每个只能出现最多一次,但是可以不同组合,输出符合条件最......