首页 > 其他分享 >AtCoder Beginner Contest 245 Ex Product Modulo 2

AtCoder Beginner Contest 245 Ex Product Modulo 2

时间:2023-06-26 12:55:24浏览次数:43  
标签:AtCoder Product Modulo qpow res ll times fst mod

洛谷传送门

AtCoder 传送门

很好的题。

下文令 \(k\) 为原题面中的 \(n\),\(n\) 为原题面中的 \(k\),\(m\) 为原题面中的 \(m\)。

从一些简单的情况入手。

1. \(m\) 为质数

  • \(k = 0\) 的情况是平凡的,只需要要求 \(\exists i \in [1, n], a_i = 0\) 即可。总方案数减去不合法方案数,答案为 \(m^n - (m - 1)^n\)。
  • \(k \ne 0\) 时,我们发现,\(a_{1 \sim n - 1}\) 可以任取,让 \(a_n\) 取 \(\frac{k}{\prod\limits_{i = 1}^{n - 1} a_i}\),所以 \(a_{1 \sim n - 1}\) 唯一对应一个 \(a_n\)。因此方案数为 \((m - 1)^{n - 1}\)。

2. \(m = p^e\),其中 \(p\) 为质数,\(e\) 为正整数

仍然特判掉 \(k = 0\)。设 \(k = r \times p^x\),其中 \(x < e, \gcd(r, p) = 1\)。我们需要把 \(x\) 个 \(p\) 分配到 \(a_{1 \sim n}\),方案数为 \(\binom{x + n - 1}{n - 1} = \binom{x + n - 1}{x}\),然后接下来 \(a_{1 \sim n - 1}\) 都可以任取与 \(p\) 互质的数,同样的它们唯一对应一个 \(a_n\)。因此方案数为 \(\binom{x + n - 1}{x} \times (m - \frac{m}{p})^{n - 1}\)。

3. 一般情况

考虑对 \(m\) 进行质因数分解,设 \(m = p_1^{e_1} \times p_2^{e_2} \times \cdots \times p_c^{e_c}\)。那么我们可以对每个质因数分别处理,根据 CRT 合并答案,也就是乘起来。接下来转化成了 \(2\) 的情况。但是有一点比较尴尬,就是 \(k = r \times p^x\) 中,\(x\) 可能 \(\ge e\)。此时就相当于 \(p_e \mid \prod\limits_{i = 1}^n a_i\),因此我们可以把任意 \(\ge e\) 个 \(p\) 分配到 \(a_{1 \sim n}\) 中,考虑容斥,总方案数减去分配的 \(p\) 的个数 \(< e\) 的方案数即可。枚举分配 \(p\) 的个数 \(c = [0, e - 1]\),也转化成了 \(2\) 的情况。但是注意此时的计算中,\(k = r \times p^x\) 中的 \(r\) 是不确定的,因此还要乘上 \(r\) 的方案数。

code
// Problem: Ex - Product Modulo 2
// Contest: AtCoder - AtCoder Beginner Contest 245
// URL: https://atcoder.jp/contests/abc245/tasks/abc245_h
// Memory Limit: 1024 MB
// Time Limit: 2000 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 double db;
typedef long double ldb;
typedef pair<ll, ll> pii;

const ll mod = 998244353;

inline ll qpow(ll b, ll p) {
	b %= mod;
	ll res = 1;
	while (p) {
		if (p & 1) {
			res = res * b % mod;
		}
		b = b * b % mod;
		p >>= 1;
	}
	return res;
}

ll n, m, K;

inline ll C(ll n, ll m) {
	if (n < m || n < 0 || m < 0) {
		return 0;
	} else {
		ll res = 1;
		for (ll i = n; i >= n - m + 1; --i) {
			res = res * i % mod;
		}
		for (ll i = 1; i <= m; ++i) {
			res = res * qpow(i, mod - 2) % mod;
		}
		return res;
	}
}

void solve() {
	scanf("%lld%lld%lld", &n, &K, &m);
	map<ll, ll> mp;
	for (ll i = 2; i * i <= m; ++i) {
		if (m % i == 0) {
			while (m % i == 0) {
				m /= i;
				++mp[i];
			}
		}
	}
	if (m > 1) {
		++mp[m];
	}
	ll ans = 1;
	for (auto p : mp) {
		ll m = 1;
		for (int _ = 0; _ < p.scd; ++_) {
			m *= p.fst;
		}
		ll k = K % m;
		if (k) {
			ll c = 0;
			while (k % p.fst == 0) {
				++c;
				k /= p.fst;
			}
			ll coef = C(c + n - 1, c), t = m - m / p.fst;
			ans = ans * coef % mod * qpow(t, n - 1) % mod;
		} else {
			ll res = qpow(m, n);
			for (int c = 0; c < p.scd; ++c) {
				ll coef = C(c + n - 1, c), t = m - m / p.fst;
				res = (res - coef * qpow(t, n - 1) % mod * (qpow(p.fst, p.scd - c) - qpow(p.fst, p.scd - c - 1) + mod) % mod + mod) % mod;
			}
			ans = ans * res % mod;
		}
	}
	printf("%lld\n", ans);
}

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

标签:AtCoder,Product,Modulo,qpow,res,ll,times,fst,mod
From: https://www.cnblogs.com/zltzlt-blog/p/17505354.html

相关文章

  • AtCoder Beginner Contest 307 ABCDE
    AtCoderBeginnerContest307A-WeeklyRecordsProblemStatement题意:告诉你有几个礼拜,问你每个礼拜走的路程和。Solution思路:按题意模拟,每7天加起来就行。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intmain(){ intn; cin>>n; llsum=......
  • AtCoder Beginner Contest 267 ABCDE
    AtCoderBeginnerContest267A-SaturdayProblemStatement题意:问你给定的天到礼拜六还要几天。思路:直接算。#include<bits/stdc++.h>usingnamespacestd;intmain(){ strings; cin>>s; if(s=="Monday")cout<<6-1<<endl; elseif(s=="Tues......
  • AtCoder Beginner Contest 252 Ex K-th beautiful Necklace
    洛谷传送门AtCoder传送门不知道为什么可以想到设\(n_c\)为颜色\(c\)的出现次数,那么\(\prodn_c\)也即选的方案数\(\approx1.25\times10^{11}\)。发现\(B=\sqrt{\prodn_c}\)不大,考虑meet-in-the-middle,把所有颜色分成两部分,每一部分的\(\prodn_c\)都接近\(......
  • CF1553F. Pairwise Modulo
    终于过了,感觉还是有点东西的。首先我们有一个很好想的\(O(n(\lnA+\sqrt{A})\logn)\)的做法。首先这个式子能写成\(p_i=\sum\limits_{j=1}^i\sum\limits_{k=1}^i\left(a_j-a_k\left\lfloor\dfrac{a_j}{a_k}\right\rfloor\right)\)的形式。前面求和那部分是简单的,我们主要去......
  • AtCoder Beginner Contest 212(E,F)
    AtCoderBeginnerContest212(E,F)E(dp)E题目大意为有\(n\)个点,我们需要找到\(k+1\)个点,用数组\(A\)表示,其中,\(A_i\)和\(A_{i+1}\)也不能一模一样,而且,规定\(A_0\)是\(1\),并且\(A_k\)也是\(1\),而且,还要满足下面的\(m\)种条边是不可以代表为\(A_i\)和\(A_{i+1}\),问我们可以......
  • AtCoder Beginner Contest(abc) 299
    A-TreasureChest题目大意给定一个由'|''*'和'.'组成的字符串,并且保证一定有1个'*'和2个'|',检查'*'是否在两个'|'之间;解题思路签到题不多嗦了;但是这里可以注意一下string的find函数;find(charc,intpos)意为从第pos个字符开始找字符c,返回值......
  • AtCoder Regular Contest 154 C Roller
    洛谷传送门AtCoder传送门被这题干爆了考虑把环压缩成块。这样一次操作就是,选择两个相邻的块,把左边块长度减\(1\),右边块长度加\(1\)。特判\(a,b\)所有块长都是\(1\)的情况,这种情况不能操作。排除掉上面的情况,我们断言:有解的充要条件是,存在某一种\(a\)的顺序,使得\(b......
  • 【题解】AtCoder-ABC306G Return to 1
    这也太强了!容易想到的是用若干环拼出这个\(10^{10^{100}}\),也就是这些环的\(\gcd\mid10\)。之后就不会了。先正图反图两次DFS,只留下\(1\)所在强连通分量里的边,对正图跑DFS生成树,定义其深度从\(0\)开始,然后有一个结论是:对于任何正整数\(a\),图中存在一个包含\(1\)......
  • AtCoder Beginner Contest 229(F,G)
    AtCoderBeginnerContest229(F,G)F(二部图,dp)F这个题大致是给你\(n+1\)个点,为\(0\)到\(n\),然后\(n\)条边是点\(0\)到\(1...n\)这些点的\(n\)条边,后面还有\(n\)条边,连接点\(i\)和\(i+1\)(其中\(i\)为\(1\)到\(n\),其中\(n\)是和\(1\)连接的)前\(n\)条边的价值是\(a_i\),后......
  • AtCoder Beginner Contest(abc) 306
    A-Echo题目大意把一个字符串的每个字符输出两遍解题思路签到题不多嗦了;神秘代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;typedefpair<int,int>PII;constintN=1e6+10;intn,m;signedmain(){cin>>n;string......