首页 > 其他分享 >CF1925D Good Trip 题解

CF1925D Good Trip 题解

时间:2024-01-29 20:57:51浏览次数:35  
标签:Good invfac int 题解 sum MAXN res CF1925D mod

考虑分别计算 \(p\) 和 \(q\)。

按照期望的定义,\(q\) 应该等于方案的总数,也就是 \(s^k\),其中 \(s\) 表示一共有多少个不同的组。

考虑如何求 \(p\),我们先只计算第 \(i\) 组对 \(p\) 的贡献。如果第 \(i\) 组一共被选了 \(1\) 次,那么贡献为:

\[g=f_i \times C_{k}^{1}\times (s-1)^{k-1} \]

这个式子中的三个值分别表示:这个组的价值,哪 \(1\) 次选了这个组,另外 \(k - 1\) 次选了哪些组。将上式推广到选 \(j\) 次,那么有:

\[g=(f_{i}+(f_{i}+1)+\dots+(f_{i}+j-1)) \times C_{k}^{j}\times (s-1)^{k-j} \]

前面的等差数列可以在线地去维护(第 \(w\) 次加上 \(f_i+w-1\)),后面的可以用组合数 & 快速幂求解。

会发现每组的贡献的后一段都和上式一样,只有 \(f\) 的值在变化。所以我们可以提公因式,把 \(f_i\) 换成 \(\sum f_i\) 即可。

会发现 \(a_i\) 和 \(b_i\) 可以忽略,因为题目对每一次选的人没有任何限制。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 4e6 + 10;
const int mod = 1e9 + 7;
inline int Qpow(int x,int k)
{
	if(x == 0 || k < 0) return 0;
	int res = 1;x = x % mod;
	for(;k;k >>= 1)
	{
		if(k & 1) res = (res * x) % mod;
		x = (x * x) % mod;
	} return res;
}
int inv[MAXN],fac[MAXN],invfac[MAXN];
inline int C(int n,int m)
{return (fac[n] * invfac[n - m] % mod) * invfac[m] % mod;}
int t,n,m,k,a[MAXN],b[MAXN],c[MAXN],p,q;
signed main()
{
	cin >> t;
	inv[0] = fac[0] = invfac[0] = 1;
	inv[1] = fac[1] = invfac[1] = 1;
	for(int i = 2;i <= 400000;i++)
	{
		inv[i] = (inv[mod % i] * (mod - mod / i)) % mod;
		fac[i] = (fac[i - 1] * i) % mod;
		invfac[i] = (invfac[i - 1] * inv[i]) % mod; 
	}
	while(t--)
	{
		cin >> n >> m >> k;
		p = 0,q = n * (n - 1) / 2;
		int sum = 0,s = 0;
		for(int i = 1;i <= m;i++)
		{
			cin >> a[i] >> b[i] >> c[i];
			sum = (sum + c[i]) % mod;
		}
		if(n == 2)
		{
			if(sum == 0) p = 0;
			else for(int i = 1;i <= k;i++) 
				p = (p + sum) % mod,sum = (sum + 1) % mod;
		}
		else for(int i = 1;i <= k;i++)
		{
			s = (s + (sum + (i - 1) * m)) % mod;
			int f = (s * C(k,i) % mod) * Qpow(q - 1,k - i) % mod;
			p = (p + f) % mod;
		}	
		q = Qpow(q,k);
		cout << (p * Qpow(q,mod - 2)) % mod << endl;
	} 
	return 0;
} 

标签:Good,invfac,int,题解,sum,MAXN,res,CF1925D,mod
From: https://www.cnblogs.com/Creeperl/p/17995296

相关文章

  • P5208 [WC2019] I 君的商店 题解
    第一道黑题,发个题解。很好玩的一道交互题。题意有一个长为\(n\)的01字符串,保证至少有一个1,且已知1的数量的奇偶性。每次可以询问两个下标集合,返回哪个下标集合中1的个数更多(相同则可能返回其中任意的一个)。求该字符串,查询次数有限。题解我们约定a,b,c等......
  • 洛谷题解-[ABC286E] Souvenir
    https://www.luogu.com.cn/problem/AT_abc286_e题目描述NNN個の都市があり、いくつかの相異なる都市の間は一方通行の直行便によって移動することができます。どの直行便が存在するかはNNN個の長さNNNの文字列S1,S2,…,SNS_1,S_2,\ldots,S_NS1​,S2​,…,SN​......
  • P5208 [WC2019] I 君的商店 题解
    第一道黑题,发个题解。很好玩的一道交互题。题意有一个长为\(n\)的01字符串,保证至少有一个1,且已知1的数量的奇偶性。每次可以询问两个下标集合,返回哪个下标集合中1的个数更多(相同则可能返回其中任意的一个)。求该字符串,查询次数有限。题解我们约定a,b,c等......
  • 题解 [ABC338D] Island Tour
    【洛谷博客】被降智的一道简单题。题意\(n\)个岛屿,第\(i\)座桥连接\(i\)和\(i+1\)(第\(N\)座桥连接着\(1\)和\(N\))。有一条长度为\(M\)的旅游序列\(X\),你需要按照顺序依次经过这些点,选择断掉一座桥使得旅游经过的桥最少。分析设断掉第\(i\)座桥会因为绕行增......
  • P10114 [LMXOI Round 1] Size 题解
    题目链接:[LMXOIRound1]Size挺有意思的诈骗题,其实这类题都喜欢批一个外壳,例如数据范围提示之类的。记得以前遇到的很多诈骗题,有一道cf的高分题,问的是区间出现次数的次数\(mex\),这玩意一开始感觉好难,出现次数还简单,还要考虑次数的次数,所以带修莫队的时候,一直没法确定怎么解决......
  • NOI 2017 蚯蚓排队 题解
    Meaning给定一些数字,对它们进行首尾相接和断开两种操作。对于每次询问,求对于每个数字,其后长度一定的数字串在给定数字串中出现的次数,并给出这些次数之积。Soultion对于每次首尾相接或断开的操作,如果直接对断点或合点两侧的整个数字串进行操作,时间复杂度不可接受。由于每次查询......
  • CF1764H Doremy's Paint 2 题解
    题目链接:CF或者洛谷高分题,感觉挺有意思的题,值得一提的是这个题的\(1\)和\(3\)版本却是两个基础题。一开始以为跟这道差不多:P8512[YnoiEasyRound2021]TEST_152题解。后面重新读了一下发现一个有趣的点:也就是是说操作的\(val\)并不太好搞了,如果\(val\)确定就基......
  • P5400 [CTS2019] 随机立方体 题解
    题目链接点击打开链接题目解法参考cmd的博客好复杂的推式子题,而且三维的对我来说好难想象/ll首先二项式反演,把恰好\(k\)个变成求至少\(i\)个的方案数令极大格子有至少\(i\)个的方案数为\(f_i\),\(R=\min\{n,m,k\}\)特判掉\(k>R\)答案为\(0\)根据二项式反演,答案......
  • P1438 无聊的数列 题解
    背景看到题解都是差分,竟然还有建两颗线段树和二阶差分的大佬。我感到不理解,很不理解。题目正解本题正解很明显就是:线段树是的,你没有看错,就只有线段树。很显然我们直接按照线段树板题写就可以了,维护题目需要维护的,注意到只有单点查询,所以我们根本不需要维护区间和,对于区间来......
  • 洛谷P10114题解
    题意简述给定一个长度为\(n\)的序列,求\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}{((d_i\oplusd_j)+(d_i\otimesd_j))}\)。思维路径观察数据范围可以发现\(n\le2\times10^6\)而\(\sum\limitsd_i\le5\times10^7\),这说明\(d\)数组中的重复值较多,直接枚举数值可......