首页 > 其他分享 >AtCoder Regular Contest 104 D Multiset Mean

AtCoder Regular Contest 104 D Multiset Mean

时间:2023-04-15 13:23:53浏览次数:47  
标签:AtCoder typedef Contest int long Regular mod

洛谷传送门

AtCoder 传送门

很平凡的一道计数啊。

考虑将所有数都减去 \(x\),那么就要求选的数和为 \(0\)。

正负分开考虑,\(0\) 可以任意选。需要多重背包求 \(f_{i,j}\) 表示选 \(1 \sim i\) 的数和为 \(j\) 的方案数。前缀和优化是平凡的。

code
// Problem: D - Multiset Mean
// Contest: AtCoder - AtCoder Regular Contest 104
// URL: https://atcoder.jp/contests/arc104/tasks/arc104_d
// Memory Limit: 1024 MB
// Time Limit: 4000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 110;
const int maxm = 1000100;

ll n, m, mod, f[maxn][maxm], g[maxn];

void solve() {
	scanf("%lld%lld%lld", &n, &m, &mod);
	f[0][0] = 1;
	for (int i = 1; i <= n; ++i) {
		mems(g, 0);
		for (int j = 0; j <= i * (i + 1) / 2 * m; ++j) {
			g[j % i] = (g[j % i] + f[i - 1][j]) % mod;
			if (j - i * (m + 1) >= 0) {
				g[j % i] = (g[j % i] - f[i - 1][j - i * (m + 1)] + mod) % mod;
			}
			f[i][j] = g[j % i];
		}
	}
	for (int i = 1; i <= n; ++i) {
		ll ans = mod - 1;
		for (int j = 0; j <= n * (n + 1) / 2 * m; ++j) {
			ans = (ans + f[i - 1][j] * f[n - i][j] % mod * (m + 1) % mod) % mod;
		}
		printf("%lld\n", ans);
	}
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:AtCoder,typedef,Contest,int,long,Regular,mod
From: https://www.cnblogs.com/zltzlt-blog/p/17320935.html

相关文章

  • 2012-2013 ACM-ICPC, NEERC, Moscow Subregional Contest题解
    题目链接:2012-2013ACM-ICPC,NEERC,MoscowSubregionalContestC.Cinderella(贪心)思路答案为大于平均值的数的数量代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);......
  • HDU 5045 Contest(费用流)
    题目地址:HDU5045终于在比赛中用网络流A了一道题。。。刷了那么多网络流,终于用到一次了。。虽然题目很简单,但是还是要纪念一下下。。。我这题的思路就是求m/n次费用流,每n个算作同一轮,对这同一轮的求最大费用流。建图就很简单了,最简单的二分图模型。代码如下:#include<iostre......
  • AtCoder Beginner Contest 297
    A-DoubleClick#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongint32_tmain(){intn,d;cin>>n>>d;vector<int>a(n);for(auto&i:a)cin>>i;for(inti=1;i<......
  • AtCoder Beginner Contest 207(D,E)
    AtCoderBeginnerContest207(D,E)D(计算几何)D这个题是两个点的集合,每个集合有\(n\)个点,我们可以让一个集合中的每一个点进行下面两种操作\(1\),可以让每一个点进行旋转\(x\)的角度\(2\),可以让每一个点的\(x\)变成\(x+disx\),\(y\)变成了\(y+disy\)问是否可以让这两个集合......
  • AtCoder Beginner Contest 247(E,F)
    AtCoderBeginnerContest247(E,F)E(思维)E这个题大意就是给一个长度为\(n\)的数组,一个\(x\)和一个\(y\),问这个数组里面可以找到多少段\([l,r]\)满足这一段里面的最大值是\(x\),最小值是\(y\)这里的做法是固定最右端,寻找最左端的可能的数量,最后相加对于每一个位置,都有作为最......
  • AtCoder Regular Contest 127
    D-LIS2难搞的地方在于取min,考虑比较\((a_i\oplusa_j,b_i\oplusb_j)\)两者的过程:是在它们第一位不一样的地方比较,取该位为0的那个。而判断两个数在某位是否相等,可以想到异或操作,然后把这两者异或起来后,由异或运算的交换律可得等价于\((a_i\oplusb_i)\oplus(a_j\oplus......
  • AtCoder Regular Contest 159
    Preface这周六紧张刺激的一日三赛,上午蓝桥杯,晚上ARC之后隔5min就是CF,可谓是手搓键盘到冒烟的一天了这场其实打的感觉很没水准,B刚开始没想清楚很多边界条件挂了三发,45min左右才过然后C的构造也不太会,随便写了个暴力也是挂挂挂,只好弃了去写D题了结果发现D题好像是个不难的线段树......
  • 练习记录- AtCoder Beginner Contest 295(D)
    vp的觉得我的D很聪明所以来写一下(乐D-ThreeDaysAgo题意就是求所有字符出现次数均为偶数的字串数量太笨了所以想了很久我把存在奇数个1当作第2位是2那么当经过了两次1 2^2这个2就变成了02就是第二位就是4...以此类推 所以我遍历一遍字符串求出当前的异或......
  • 练习记录-AtCoder Beginner Contest 296(A-F)
    vp的感觉整场挺智慧A-Alternately找有没有连续的男女#include<bits/stdc++.h>#defineclosestd::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)usingnamespacestd;typedeflonglongll;constllMAXN=3e5+7;constllmod=1e9+7;constllinf=0x3......
  • AtCoder Beginner Contest 278
    口胡一下,从青色开始E-GridFilling给定一个W×H的矩阵,每个格子有一个数,在1和N之间,给定w<=W,h<=H,对于每个满足1<=i<=W-w+1,1<=j<=H-h+1的格子(i,j),求以它为左上角的w×h矩阵被遮住后整个大矩阵还剩下几种数字。W,H,N,w,h<=300首先我们看见这个熟悉的300就知道是立方算法又注......