首页 > 其他分享 >LY1467 [ 20231113 NOIP 模拟赛 T3 ] Remember11

LY1467 [ 20231113 NOIP 模拟赛 T3 ] Remember11

时间:2023-11-19 16:23:48浏览次数:38  
标签:11 include 20231113 NOIP int T3 tp mod fill

题意

给定 \(n\) 个数,求将她们收尾拼接形成 \(11\) 的倍数的方案数。

Sol

数数题。

众所周知,是 \(11\) 的倍数意味着将该数错位相减 \(mod 11 = 0\)。

注意到偶数位数的数与奇数位数的数的贡献是不同的。

考虑将她们分开计算,然后合并。

设 \(f_{ijk}\) 表示前 \(i\) 个 奇数,其中有 \(j\) 个是 正贡献,\(mod 11 = k\)。

\(g_{ijk}\) 同理。

考虑合并,注意到如果在两个奇数中间插入偶数对位数的奇偶没有贡献。显然 \(f_{n1, n1/2, k}\) 对答案有贡献。

枚举偶数的数量、以及 \(mod 11\) 即可。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#include <vector>
#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 N = 2005, mod = 147744151;
vector <int> s1, s2;

array <array <array <int, 11>, N>, 2> f, g;
int cal(int x) {
	while (x >= 11) x -= 11;
	while (x < 0) x += 11;
	return x;
}
void Mod(int &x) {
	if (x >= mod) x -= mod;
	if (x < 0) x += mod;
}

array <int, 6005> fac, inv;
int pow_(int x, int k, int p) {
	int ans = 1;
	while (k) {
		if (k & 1) ans = ans * x % p;
		x = x * x % p;
		k >>= 1;
	}
	return ans;
}
void init() {
	fac[0] = 1;
	for (int i = 1; i <= 6000; i++)
		fac[i] = fac[i - 1] * i % mod;
	inv[6000] = pow_(fac[6000], mod - 2, mod);
	for (int i = 6000; i; i--)
		inv[i - 1] = inv[i] * i % mod;
}
int C(int n, int m) {
	if (n < m) return 0;
	return fac[n] * inv[m] % mod * inv[n - m] % mod;
}
int Stab(int n, int m) {
	if (m == 0) return n == 0;
	return C(n + m - 1, m - 1);
}

void solve() {
	s1.clear(), s2.clear();
	int n = read();
	for (int i = 1; i <= n; i++) {
		int x = read();
		if (to_string(x).size() & 1) s1.push_back(x % 11);
		else s2.push_back(x % 11);
	}
	array <int, 11> tp1; tp1.fill(0);
	array <array <int, 11>, N> tp2; tp2.fill(tp1);
	f.fill(tp2), g.fill(tp2);
	f[0][0][0] = g[0][0][0] = 1;
	for (int i = 0; i < (int)s1.size(); i++) {
		array <int, 11> tp;
		tp.fill(0);
		f[(i + 1) & 1].fill(tp);
		for (int j = 0; j <= i; j++) {
			for (int k = 0; k < 11; k++) {
				int tp = f[i & 1][j][k];
				f[(i + 1) & 1][j + 1][cal(k - s1[i])] += tp;
				Mod(f[(i + 1) & 1][j + 1][cal(k - s1[i])]);
				f[(i + 1) & 1][j][cal(k + s1[i])] += tp;
				Mod(f[(i + 1) & 1][j][cal(k + s1[i])]);
			}
		}
	}
	for (int i = 0; i < (int)s2.size(); i++) {
		array <int, 11> tp;
		tp.fill(0);
		g[(i + 1) & 1].fill(tp);
		for (int j = 0; j <= i; j++) {
			for (int k = 0; k < 11; k++) {
				int tp = g[i & 1][j][k];
				g[(i + 1) & 1][j + 1][cal(k - s2[i])] += tp;
				Mod(g[(i + 1) & 1][j + 1][cal(k - s2[i])]);
				g[(i + 1) & 1][j][cal(k + s2[i])] += tp;
				Mod(g[(i + 1) & 1][j][cal(k + s2[i])]);
			}
		}
	}
	/* write(f[s1.size() & 1][s1.size() / 2][2]), puts(""); */
	int ans = 0;
	for (int i = 0; i <= (int)s2.size(); i++) {
		for (int k = 0; k < 11; k++) {
			int tp1 = fac[s1.size() / 2] * fac[s1.size() - s1.size() / 2] % mod
					* fac[i] % mod * fac[s2.size() - i] % mod,
				tp2 = Stab(i, s1.size() - s1.size() / 2)
					* Stab(s2.size() - i, s1.size() / 2 + 1) % mod,
				tp3 = f[s1.size() & 1][s1.size() / 2][(11 - k) % 11] * g[s2.size() & 1][i][k] % mod;
			ans += tp1 * tp2 % mod * tp3 % mod;
			Mod(ans);
		}
	}
	write(ans), puts("");
}
signed main() {
	freopen("remember.in", "r", stdin);
	freopen("remember.out", "w", stdout);
	init();
	int T = read();
	while (T--) solve();
	return 0;
}

标签:11,include,20231113,NOIP,int,T3,tp,mod,fill
From: https://www.cnblogs.com/cxqghzj/p/17842182.html

相关文章

  • NOIP2023 游记
    Day-1最后一场模拟赛,死磕T1喜提\(15\)分,被Shui_Dream教育。正式比赛一定不能这么干啊,去年全国其他选手「喵了个喵」的惨痛经历令人发抖。想了很多种暴毙的情况,告诉自己一定不能犯。感觉后两题也不是很难啊。看来题目难度真不一定按顺序排列的啊。下午gj带我们去上了......
  • NOIP 2023 游记
    彻底成为NOIP搞笑型选手了。考前得甲流了,但是好了,最近这阵子长沙各种各样的感冒都多(心疼对面感冒没好全的lcm)。晚上睡得挺好,反正去考场的路上自我感觉良好。开题,冷静了一下把四个题都读完了,当时的想法是T1一眼就会了,T2好像是个随便搞搞的细节题,T3好神秘,T4又是区间又是最......
  • NOIP2023游记
    Day-??校庆期间润到机房看民间数据,发现CSPAK了一车,希望NOIP不要是这个难度!Day-?老叶和裘讲尽量给我们多一点时间,于是当天下午就开始停课了(Day-1请了个假回家睡大觉!早上被迫起来打集训队胡策,写写弄弄找了点规律花2h过了T3。发现T2是个巨大难写的仙人掌上长剖板......
  • NOIP2023 游记
    Day998244352(20231117)来到考点附近。在大巴车上玩poki,到站了玩MC,从中午玩到了晚上。Day0开题。T1一眼像是排序,但大约15min后意识到只要对每个字符串找到最大和最小然后\(O(n^2)\)就过了。T2每个点向最后的点连边,用并查集维护,如果\(x\)和\(\negx\)被连到......
  • NOIP2023游记
    省流:寄!Day-?开始全天停课,一天一场模拟赛。还是改不了死磕的毛病,经常纠结于一道题而舍弃了更好写的暴力。很好奇某位佬是怎么做到模拟赛划水还能天天rk1的。寄!Day-7全真模拟了luogu的模拟赛,然后成了rk1?要是noip也出构造就好了(虽然这不可能。拜谢rk2的coffee。......
  • NOIP 2023 输麻记
    Day-2NOIP之前最后一场胡策,当然要认真打啊!最后喜提70+20+50=140。一题不会。赛后看题解发现T1就差一点了。希望NOIP不要被奇奇怪怪的位置卡题(flag)。Day-1打板子,复习了一下之前做的题,并奶了一口复习的这些都不会考(这个倒是奶对了)。Day1感觉晚上睡得不是很好,并没有......
  • noip2023游寄
    周五出发去广州,从周三晚上就回家了,然后一直写不进去题。好,周五了。好,坐动车去广州了。车上睡了很久,一会就到了。好,到广州了。坐了很久地铁,真的很累。找了好久旅馆,终于到了。好累,睡了好久。打了缩点的板子,睡了好久。18号了。好,打车去考场了。好,8:27了。好,开考了。t1会......
  • 洛谷 P9869 [NOIP 2023] 三值逻辑 题解
    https://www.luogu.com.cn/problem/P9869?contestId=145259看到要给变量赋初始值,还是T,F,U之类的,容易想到2-SAT。设\(1\simn+m\)的点表示\(x_1,x_2,\dots,x_{n+m}\)为T的点,其中\(x_{k+n}(1\leqk\leqm)\)表示在第\(k\)次操作被操作的变量的值(操作......
  • ZJ NOIP 2023 迷惑行为大赏(持续更新)
    ZJNOIP2023迷惑行为大赏(持续更新)fuck无。f**k94次出现的准考证号orz16次出现的准考证号求大佬ZJ-04965.?《13个文件》......
  • 游记 NOIP2023(public version)
    游记NOIP2023(publicversion)11.1720:30提前一天到达考点:中山市中山纪念中学。没有看鸭子。11.188:30正式开考。然后打开了一下虚拟机,有了上一次的经验,这次直接挂好了虚拟机的共享文件夹,题目也找到在哪里了,比较顺利。T1感觉比较简单,先做;T2......