首页 > 其他分享 >ABC245Ex题解

ABC245Ex题解

时间:2024-11-22 20:55:52浏览次数:1  
标签:方案 ABC245Ex 题解 ll times res 序列 我们

前言

\(2024.11.21\) 联考第三题,本人由于太菜没有推出 \(m=p^x\) 的性质遂部分分跑路,作文以记之。

简要题意

对于一个长度为 \(n\),值域为 \([0,m-1]\) 的序列 \(A\),若 \(A\) 满足 \(\Pi_{x\in A}x\equiv res\pmod m\) 则称 \(A\) 是好的。求好序列的方案数。

数据范围:\(1\le n\le10^9,1\le res\le m\le10^{12}\)。

题解

因为联考时给了一些部分分,里面有一定的提示,所以难度小了很多。此题解大体按照部分分性质讲解。

基本情况

首先我们讨论 \(m=p,p\in prime\) 的情况。

如果这个时候 \(res=0\),说明序列的乘积是 \(m\) 的倍数。但是 \(m\) 已经是一个质数,且序列中的数全部小于 \(m\)。这时只有当序列中有 \(0\) 存在时才对答案有贡献。稍加容斥,答案就是 \(m^n-(m-1)^n\)。

如果 \(res\) 不为零,肯定不能选 \(0\)。我们其实可以先随便选择前 \(n-1\) 个数,然后这前 \(n-1\) 个数就可以确定最后一个数。证明一下:首先前 \(n-1\) 个数的乘积取模后肯定在 \([0,m-1]\),令这个乘积为 \(x\),然后因为 \(m\) 是质数,所以 \(x\) 的 \([0.m-1]\) 倍在模 \(m\) 的意义下一定对应 \([0,m-1]\),且是一一对应的关系,所以可以唯一确定 \(A_n\)。所以这种情况方案数为 \((m-1)^{n-1}\).

现在扩展一下,若 \(m=p^x,p\in prime\) 时我们又该如何计算方案?我们还是得分两种情况讨论。

拓展1

如果 \(res=0\),说明序列的乘积得是 \(m\) 的倍数,换句话说也就是 \(p^x\) 的倍数。翻译一下,我们要让 \(A\) 中包含至少 \(x\) 个 \(p\),其他数在合法范围内随便选。然后因为 \(m\le10^{12}\),所以 \(x\le40\)。我们就可以容斥一下,转化成总方案数减去序列中少于 \(x\) 个 \(p\) 的方案数。所以我们现在需要求解这样一个问题:

若我们钦定序列中有 \(i\) 个 \(p\),序列方案数。

问题转化

我们换一个视角,也就是把 \(i\) 个 \(p\) 放入 \(n\) 个位置的方案数且同一位置可放多个也可以不放。这不就是把 \(i\) 个相同的球放入 \(n\) 个不同的盒子且盒子可为空吗?这就是一个很经典的组合数问题了,而且证明不重要故直接给出结论。方案数是 \(n+i-1\choose n-1\),然后换一下变成 \(n+i-1\choose i\),于是就可以线性预处理了。

考虑完 \(p\) 的放置情况后我们还要考虑正常填数的方案。接下来的部分也就是笔者赛时没有想通的地方。对于一个位置 \(i\),如果我已经放了一个 \(p^{c_i}\),是否就意味着这里不能继续填数了呢?答案是否定的。其实我只要选出一个数 \(t\) 满足 \(t\times p^{c_i}<m\) 就行,所以我们对于每一位都要考虑。因为填了一些 \(p\) 之后对现在选数只有范围的限制

知道这个有什么关系吗?就是你不用考虑一个位置是否填数,而是考虑填数的范围。这显然满足乘法原理。现在考虑范围,对于位置 \(i\) 已经填了 \(p^{c_i}\),我还能乘上哪些数?首先排除 \(p\) 的倍数,因为我已经把 \(p\) 填好了。所以我们填的一个数一定是 \(y\times p+d,d\in[1,p)\) 的形式。然后我们填数还要满足小于 \(m\),所以有 \((y\times p+d)\times p^{c_i}<p^x\),把 \(p^{c_i}\) 移项可得 \(y\times p+d<p^{x-c_i}\)。

翻译成人话就是我们选的数小于 \(p^{x-c_i}\) 且不为 \(p\) 的倍数。也许你会有疑问,\(c_i\) 怎么处理?先别急,看到后面你就懂了。我们先关注 \(y\times p+d\) 中的 \(y\) 取值范围,这显然是 \([0,p^{x-c_i-1})\);然后 \(d\) 的范围前面提到过是 \([1,p)\),所以位置 \(i\) 可以选择的方案就是 \(p^{x-c_i-1}\times(p-1)\)。然后总方案就是把 \(n\) 个位置的方案乘起来:

\[\prod_{i=1}^n p^{x-c_i-1}\times(p-1) \]

因为我钦定选了 \(i\) 个 \(p\),所以有 \(\sum c_j=i\)。当我们把上面的式子拆开时,就有:

\[p^{xn-\sum c_j-n}\times(p-1)^n \]

然后你就发现所有 \(c_j\) 全部加在了一起变成一个 \(i\)。于是问题最终的答案就是:

\[{n+i-1\choose i}\times p^{xn-n-i}\times(p-1)^n \]

解决了钦定有 \(i\) 个 \(p\) 时的方案,我们就可以用总方案减去所有小于 \(x\) 时的方案就可以得到 \(res=0\) 的答案:

\[p^{xn}-\sum_{i<x}{n+i-1\choose i}\times p^{xn-n-i}\times(p-1)^n \]

拓展2

然后讨论 \(res\) 不为 \(0\) 的情况,这个时候我们最多都选不到 \(x\) 个 \(p\) 了。但是具体选多少还不好说。如果我把 \(res\) 拆一拆,写成 \(r\times p^y\) 的形式,你是否会有一些想法呢?

考虑我们现在要在序列中选出恰好 \(y\) 个 \(p\),这样把等式两边的 \(p^y\) 抵消后就变成了基本情况中的第二种。我们恰好选 \(y\) 个 \(p\) 的方案数是:

\[{n+y-1\choose y}\times p^{xn-n-y}\times(p-1)^n \]

但是考虑到序列的乘积只满足了 \(p^y\) 的倍数,所以还要去重。考虑如何去重。思路是用现在求得的总方案数乘合法概率。考虑现在的序列会得出些什么结果,写成集合是 \(\{k\times p^y|\gcd(k,p)=1,k<p^{x-y}\}\)。然后类比之前求位置选数的方案数的方法可得 \(p^{x-y-1}\times(p-1)\)。考虑到如果我们已经确定了前 \(n-1\) 个数后,最后一个数就已经唯一确定(原因与之前类似)。 然后因为如果把等式两边同时除以 \(p^y\),两边的数都与 \(p^x\) 互质,所以在随机选数的情况下可以类比欧拉定理得出序列的乘积是均匀的。所以合法的概率就是 \(\frac{1}{p^{x-y-1}\times(p-1)}\),乘上总方案得到最终答案:

\[{n+y-1\choose y}\times p^{xn-x-n+1}\times(p-1)^{n-1} \]

拓展3

现在讨论一般情况。基于以上的内容,我们考虑将 \(m\) 写成 \(p1^{c1}p2^{c2}p3^{c3}\dots p_k^{c_k}\) 的形式。我们可以先求出所有 \(\prod_{x\in A}x\equiv (res\bmod p_i^{c_i})\pmod {p_i^{c_i}}\) 的方案数然后再乘法原理直接乘。可是为什么直接做是对的呢?

证明

假设对于每一个子问题我们已经找出任意一组合法解,我们把这些等式写成下面形式:

\[(\prod x\bmod p_i^{c_i})\equiv (res\bmod p_i^{c_i})\pmod {p_i^{c_i}} \]

令 \(T = \prod x\bmod p_i^{c_i}\),则我们现在就是在做中国剩余定理的合并。然后合并后的解一定合法,所以我们求出的任意一组解都可以合并,于是就直接乘起来即可。

代码

ll sol(ll rr, ll d, int x, ll mod){
	if(! rr){
		ll s = 0;
		for(int i = 0; i < x; ++i)s = (s + C[i] * qmi(d, x * n - n - i) % p * qmi(d - 1, n)) % p;
		return (qmi(mod, n) - s + p) % p;
	}
	int y = 0; while(rr % d == 0)rr /= d, ++y;
	return C[y] * qmi(d, x * n - n - x + 1) % p * qmi(d - 1, n - 1) % p;
}

ll ans = 1;

signed main(){
	freopen("equiv.in", "r", stdin);
	freopen("equiv.out", "w", stdout);
	n = rd(), r = rd(), m = rd(); C[0] = 1;
	for(int i = 1; i < 50; ++i)C[i] = C[i - 1] * (n + i - 1) % p * qmi(i, p - 2) % p;
	for(ll i = 2; i * i <= m; ++i)if(m % i == 0){
		int c = 0; ll x = 1; while(m % i == 0) m /= i, x *= i, ++c;
		ans = ans * sol(r % x, i, c, x) % p;
	}
	if(m > 1)ans = ans * sol(r % m, m, 1, m) % p;
	wt(ans);
	return 0;
}

标签:方案,ABC245Ex,题解,ll,times,res,序列,我们
From: https://www.cnblogs.com/Nekopedia/p/18563723

相关文章

  • 括号配对 C++题解
    括号配对内存限制:512MiB时间限制:1000ms标准输入输出题目类型:传统评测方式:文本比较题目描述Hecy又接了个新任务:BE处理。BE中有一类被称为GBE。以下是GBE的定义:空表达式是GBE如果表达式 A 是GBE,则 [A] 与 (A) 都是GBE如果 A 与 B 都是GBE,那么......
  • 回文质数 C++题解
    回文质数内存限制:64MiB时间限制:1000ms标准输入输出题目类型:传统评测方式:文本比较题目描述因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以151号是回文质数。写一个程序来找出范围[a,b](5<=a<b<=100,000,000)间的所有回文质数;输入......
  • LeetCode题解:26.删除有序数组中的重复项【Python题解超详细,双指针法】,知识拓展:原地修
    题目描述        给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。        考虑 nums 的唯一元素的数......
  • android开发中,button设置shape后,shape的颜色不生效的问题解决方案
    检查AndroidManifest.xml中的主题的属性<applicationandroid:name=".BaseApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:networkSecurityConf......
  • [题解]P1641 生成字符串
    P1641[SCOI2010]生成字符串由题意可设\(f[i][j]\)表示用了\(i\)个\(0\),\(j\)个\(1\)的答案,那么有转移:\[f[i][j]=\begin{cases}0&i>j\\f[i][j-1]&i=j\\f[i-1][j]+f[i][j-1]&i<j\\\end{cases}\]状态数是\(O(n^2)\),转移是\(O(1)\),总时间复杂度\(O(n^2)\),期望得......
  • [题解]P2151 [SDOI2009] HH去散步
    P2151[SDOI2009]HH去散步发现\(n,m\)非常小而\(t\)非常大,所以果断考虑矩阵。这道题如果不限制“不能立即沿刚刚过来的路回去”,就直接用邻接矩阵求\(t\)次幂然后直接调用\(ans[a][b]\)就好了。加上限制后,我们用点就比较难考虑了,因为点是无方向的。我们可以试着用边来转移,和点......
  • CF1375题解
    CF评分2693,豆瓣拒绝评分,这套题啥实力就不用说了CF1375A被爆切了(悲,md想了20分钟没有想出来,然后就看了一眼题解,wc这不直接一正一负就解决了吗。。。脑子不转了CF1375B切了,首先有一组必然合法的解,就是把所有数都变为大于0的数,这样必然是最大的解,若\(a[i]\)还有比这组解大的就......
  • Atcoder Regular Contest 061 题解
    ARC061C.ManyFormulas*1089首先预处理出原数区间\([i,j]\)所代表的真实数字。然后注意到\(|s|\leq10\),所以直接爆搜回溯最后判断即可。或者状压枚举也可以,反正非常简单。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;strings;LLSum[11][11]......
  • 2024考前集训测试37 错峰旅行 题解
    题目描述小Z终于迎来了自己的大学生活最后的时刻,他决定用自己的积蓄来一场说走就走的毕业旅行,并且不玩的开心不上班。然而,他很快就发现这个决定并非那么简单。由于是暑假,假期人多,他既不想错过旅行的最佳时期,又不想在人群中挣扎,预测旅游热门城市的拥挤时段,就像是一道难题摆在他......
  • ybtoj 高效进阶题解索引
    密码:sunxuhetai2009--------------------云落的分割线--------------------基础算法第1章-递推算法第2章-贪心算法--------------------云落的分割线--------------------图论第1章-并查集第4章-强连通分量--------------------云落的分割线--------------------......