首页 > 其他分享 >LY1464 [ 20231112 NOIP 模拟赛 T4 ] 序列计数

LY1464 [ 20231112 NOIP 模拟赛 T4 ] 序列计数

时间:2023-11-21 09:03:59浏览次数:42  
标签:20231112 Matrix NOIP int T4 mid times ++ ans

题意

给定 \(n, m\)。

求:

  • \(a_1 + a_2 + ... + a_m = n\)
  • \(1 ^ {a_1} \times 2 ^ {a_2} \times ... \times m ^ {a_m} \equiv x (\bmod m)\)

对于 \(x \in [1, m)\) 满足上述条件的方案数。

Sol

注意到下面的式子等价于:

\(1 \times 1 \times 1 ... \times 2 \times 2 ... \times... \times m\)

那么问题就变成,在 \(n\) 个格子中,插入 \([1, m]\),使得序列单调不降,乘积与 \(x\) 在膜 \(m\) 意义下,同余的方案数。

注意到我们并不关心 \(n\),考虑使用类似倍增的方法优化。

设 \(f_{i, l, r, k}\) 表示第 \(2 ^ i\) 个位置,值域的上下界为 \([l, r]\),乘积膜 \(m\) 等于 \(k\)。

转移是 \(trivial\) 的。

\(f_{i, l, r, k} = \sum_{m1 = 1} ^ r \sum_{m2 = m1} ^ r\sum_{l = 0} ^ x f_{i - 1, l, m1} \times f_{i - 1, m2, r}\)

然后我们发现这个玩意可以前缀和优化。

设 \(g_{i, l, r, k} = \sum_{m1 = 1} ^ {r} g_{i, m1, r, k}\)。

复杂度为 \(O(m ^ 5 \times log(n))\),可以通过。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#include <ctime>
#include <cstring>
/* #define int long long */
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
	int p = 0, flg = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') flg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		p = p * 10 + c - '0';
		c = getchar();
	}
	return p * flg;
}
void write(int x) {
	if (x < 0) {
		x = -x;
		putchar('-');
	}
	if (x > 9) {
		write(x / 10);
	}
	putchar(x % 10 + '0');
}
const int M = 41, mod = 1e9 + 7;
int _m;
void Mod(int &x) {
	if (x >= mod) x -= mod;
	if (x < 0) x += mod;
}
struct Matrix {
	int f[M][M][M];
	Matrix(int flg) {
		memset(f, 0, sizeof(f));
	}
	friend Matrix operator *(Matrix x, Matrix y) {
		for (int r = 0; r < _m; r++)
			for (int k = 0; k < _m; k++)
				for (int l = r - 1; ~l; l--)
					y.f[l][r][k] += y.f[l + 1][r][k], Mod(y.f[l][r][k]);
		Matrix ans(0);
		for (int l = 0; l < _m; l++)
		for (int mid = l; mid < _m; mid++)
		for (int k1 = 0; k1 < _m; k1++) {
			if (!x.f[l][mid][k1]) continue;
			for (int r = mid; r < _m; r++)
				for (int k2 = 0; k2 < _m; k2++) {
					if (!y.f[mid][r][k2]) continue;
					int k = k1 * k2 % _m;
					ans.f[l][r][k] += 1ll * x.f[l][mid][k1] * y.f[mid][r][k2] % mod;
					Mod(ans.f[l][r][k]);
				}
		}
		return ans;
	}
	friend Matrix operator ^(Matrix x, int k) {
		Matrix ans(0);
		ans.f[0][0][1] = 1;
		while (k) {
			if (k & 1) ans = ans * x;
			x = x * x;
			k >>= 1;
		}
		return ans;
	}
};

array <int, M> ans;

int main() {
#ifdef ONLINE_JUDGE
	freopen("seq.in", "r", stdin);
	freopen("seq.out", "w", stdout);
#endif
	int n = read(), m = read();
	_m = m;
	Matrix T(0);
	for (int i = 0; i < m; i++)
		T.f[i][i][i] = 1;
	T = T ^ n;
	for (int i = 0; i < m; i++)
		for (int j = i; j < m; j++)
			for (int k = 0; k < m; k++)
				ans[k] += T.f[i][j][k], Mod(ans[k]);
	for (int i = 0; i < m; i++)
		write(ans[i]), puts("");
	cerr << clock() << endl;
	return 0;
}

标签:20231112,Matrix,NOIP,int,T4,mid,times,++,ans
From: https://www.cnblogs.com/cxqghzj/p/17845420.html

相关文章

  • NOIP2023
    T1:词典题意:给定\(n\)个长度为\(m\)的字符串\(w_1,w_2,\cdots,w_n\)。对于每个\(i=1,2,\cdots,n\)询问是否存在\(w_1',w_2',\cdots,w_n'\)使得对于每个\(j=1,2,\cdots,n\),\(w_j'\)都可以由\(w_j\)交换字符得到,且对于\(j\neqi\)都有\(w......
  • NOIP游记
    人生第一次NOIP!XD 没想到最终CSP-S压线得了220,成功参加NOIPNOIP前大概集训了一两周,天天打模拟赛,都要打吐了。模拟赛的成绩波动很大(当然,大部分时候都在垫底),老是犯一些很SB的错误,比如忘删freopen的注释  :(不过最后几场还考得勉勉强强,增加了一波confidence考试前一天晚上9......
  • NOIP2023游记
    写下这篇游记的时候,我的内心是怎样的五味杂陈啊。随一首歌,随到了《如愿》。世间所有的路都将与你相逢。考前一天便感觉不太对劲,嗓子有点火辣辣地疼,鼻腔内也充斥着少量鼻涕。但这显然是心理作用的吧!于是第二天一上场头就开始变得有些蒙。偏偏系统炸了,大家都下不到题面。等......
  • NOIP 2023
    推结论力低下的问题直到高二赛季的NOIP才显露出来。或许这就是命运吧。T1求出每个字符串能够调整得到的字典序最大和字典序最小的字符串,只需要判断一个串对应的最小串是否比其它所有串的最大串小即可。可以维护最大串的最小值和次小值。T2动态维护\(pos_i\)表示\(i\)位......
  • 2023 NOIp 游记
    前言CSP-S当时没写是害怕当小丑,NOIp反正可能要退役了,就没有什么小丑可言了,就先写了。CSP-S游记Day-20~0在CDQZ集训,联考的成绩也还行,但是一直被CDQZ和其他学校的高一薄纱,感觉要退役了qwq。考前两天还跑去QG联考了,成绩还行,也算有点信心,但是还是很担心。考前一天没有......
  • noip2023 题解(民间数据)
    P9868[NOIP2023]词典(民间)直接把每个串\(w_i\)都从大到小/从小到大排一下,记作\(a_i,b_i\)。如果\(b_i\)小于除了\(i\)之外的所有\(a_i\),说明可以,否则不行。求一个前后缀最大值即可。复杂度\(\mathcal{O}(26n+nm)\)。点击查看代码#include<bits/stdc++.h>usingname......
  • NOIP 2023 游记
    NOIP2023游记赛前HF周四下午就放了,回家好好休息休息。周五上午睡了个懒觉,玩了会游戏。下午被我妈拉出去骑车,骑到一半,涵说他们因为教师研讨会放假,在图书馆写作业。说有个挂件想给我,然后就把我妈丢下骑车过去。一共52km,晚上8点才回到家。后来考完我妈和HF说了骑车这件......
  • T4
    #include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m,t,k,d,c,dp[5005][5005],x,y,z,a[5005][5005],s[5005][5005];signedmain(){ scanf("%d%d",&c,&t); for(intp=1;p<=t;p++){ memset(a,0,sizeofa);//......
  • 2023.11.19 NOIP 总结
    考试复盘进场读了下题,T1很简单,并且后面三道题都挺可做的。因为可以任意交换,直接令当前串字典序最小,其它串字典序最大,然后比较一下就完事了。因为字符集大小只有\(26\),直接开桶模拟就可以了。发现不是很好写,想了一下其实只需要判断一下当前串字典序最小的字母的字典序是否大于其......
  • NOIP 游记
    赛前一周想到了一首东方曲子的旋律但是一直想不起来曲名。《非科学的表裏一体》——豚乙女DAY0晚上翻我听过的秘封曲找到了,是科学世纪的少年少女。梦里见到的景色,也将呈列于现实之中。DAY0坐高铁来到了秦皇岛,然后到了先听四亿。大堂经理没让我失望,在hz教练说完“你......