题解 CF1808E【Minibuses on Venus】

problem

一个长为 \(n\) 的序列,每一个数是 \([0,k)\) 的整数。说一个数列幸运,当且仅当 \(\exists i\) 使得 \(a_i\equiv(\sum_j a_j)-a_i\pmod k\),求方案数,\(n,k\leq 10^{18}\)

引理:若钦定数列的和为 \(s\) ,则方案数为 \(k^{n-1}\),注意 \(n=0\) 特判。

显然题目条件为:\(\sum_j a_j\equiv 2 a_i\pmod k\)

题解:https://codeforces.com/blog/entry/114392?#comment-1017709

//https://codeforces.com/contest/1808/submission/199700596
from math import gcd
n, k, p = map(int, input().split())
if k % 2: print((pow(k, n, p) - pow(k-1, n, p) + (-1) ** ((n + 1) % 2) * (gcd(n-2, k) - 1)) % p)
else: print((pow(2, p-2, p) * (pow(k, n, p) - pow(k-2, n, p)) + (-1) ** ((n + 1) % 2) * (gcd(n-2, k//2) - 1) * pow(2, n-1, p)) % p)

solution when \(k\) is odd

Let \(\sum a_i=2s\),算出有至少一个 \(s\) 的方案数:

\[\sum_{i=1}^n(-1)^{i+1}\binom{n}{i}k^{n-i-1}-\frac{(-1)^{n+1}}{k}+(-1)^{n+1}[ns\equiv 2s\pmod k]. \]

\[-\frac{1}{k}(\boxed{\sum_{i=0}^n(-1)^i\binom{n}{i}k^{n-i}}-k^n)-\frac{(-1)^{n+1}}{k}+(-1)^{n+1}[ns\equiv 2s\pmod k]. \]

\[k^{n-1}-\frac{(k-1)^n}{k}-\frac{(-1)^{n+1}}{k}+(-1)^{n+1}[ns\equiv 2s\pmod k]. \]

枚举所有的 \(s\)

\[ans=k^n-(k-1)^n+(-1)^n+(-1)^{n+1}\sum_{s=0}^{k-1}[ns\equiv 2s\pmod k]. \]

\[ans=k^n-(k-1)^n+(-1)^n-(-1)^{n}\gcd(n-2,k). \]

solution when \(k\) is even

因为在这里 \(i\)\(i+k/2\) 翻一倍是一样的,所以假如总和是 \(s\),开始容斥:

\[ans=k^{n-1}-\left( \sum_{0\leq a+b\leq n}(-1)^{a+b}\binom{n}{a,b,n-a-b}k^{n-a-b-1}-\sum_{a+b=n}(-1)^n\binom{n}{a}k^{-1}+(-1)^n\Delta \right)\]

\(\Delta\) 是正确的余项,我们等会再来;\(\binom{n}{a,b,n-a-b}\) 是广义组合数,表示把 \(n\) 划分为 \(a,b,n-a-b\) 三个集合的方案数,它等于 \(\frac{n!}{a!b!(n-a-b)!}\)

化简括号内除了 \(\Delta\) 的部分:

\[\frac{1}{k}\left(\sum_{0\leq t\leq n}(-1)^tk^{n-t}\boxed{\frac{n!}{(n-t)!}}\sum_{a=0}^t\boxed{\frac{1}{a!(t-a)!}}-(-1)^n\boxed{\sum_{a=0}^n\binom{n}{a}}\right) \]

补全两个组合数,写二项式定理:

\[=\frac{1}{k}\left(\sum_{0\leq t\leq n}(-1)^tk^{n-t}\boxed{\frac{n!}{(n-t)!t!}}\sum_{a=0}^t\boxed{\frac{t!}{a!(t-a)!}}-2^n(-1)^n\right) \]

\[=\frac{1}{k}\left(\sum_{0\leq t\leq n}(-1)^tk^{n-t}\binom{n}{t}\boxed{\sum_{a=0}^t\binom{t}{a}}-2^n(-1)^n\right) \]

\[=\frac{1}{k}\left(\sum_{0\leq t\leq n}(-1)^tk^{n-t}\binom{n}{t}2^t-2^n(-1)^n\right) \]

\[=\frac{1}{k}\left(\boxed{\sum_{0\leq t\leq n}\binom{n}{t}(-2)^tk^{n-t}}-2^n(-1)^n\right) \]

\[=\frac{(k-2)^n-(-2)^n}{k} \]

所以答案

\[ans=k^{n-1}-\frac{(k-2)^n-(-2)^n}{k}-(-1)^n\Delta \]

现在想一下 \(\Delta\):就是说 \(i,i+k/2\) 填满了整个序列,总和又是 \(2i\) 的方案数

\[\Delta=[2i\equiv ni\pmod k]\sum_{a\text{是偶数}}^n\binom{n}{a}+[2i\equiv ni+k/2\pmod k]\sum_{a\text{是奇数}}^n\binom{n}{a}=2^{n-1}([2i\equiv ni\pmod k]+[2i\equiv ni+k/2\pmod k]) \]

注意到若设 \(m=n-2\) 则相当于求 \([mi\equiv 0\pmod k]+[mi\equiv k/2\pmod k]\),除非 \(k=0\) 否则这两个只能成立一个,所以这相当于:

\[[mi\equiv 0\pmod{k/2}] \]

注意到这样做连上下界都调好了

所以

\[total=\frac{k^n-(k-2)^n+(-2)^n}{2}+(-2)^{n-1}\gcd(n-2,k/2) \]

code

点击查看代码
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int P=1e9+7;
LL mod(LL x){return (x%P+P)%P;}
void red(LL&x){x%=P;}
LL qpow(LL a,LL b,int p=P){LL r=1;for(a%=p;b;b>>=1,a=a*a%p) if(b&1) r=r*a%p; return r;}
LL gcd(LL a,LL b){return !b?a:gcd(b,a%b);}
LL n,k;
int main(){
	scanf("%lld%lld%d",&n,&k,&P);
	if(n==1) return puts("1"),0;
	int f=n&1?-1:1;
	if(k&1) printf("%lld\n",mod(qpow(k,n,P)-qpow(k-1,n,P)+f-f*gcd(n-2,k)));
	else printf("%lld\n",mod(qpow(2,P-2,P)*(qpow(k,n,P)-qpow(k-2,n,P)+qpow(-2,n,P))+qpow(-2,n-1)*gcd(n-2,k/2)));
	return 0;
}

回顾与反思

二项式定理

\[\sum_{i=0}^n\binom{n}{i}a^ib^{n-i}=(a+b)^n. \]

\[\Rightarrow\sum_{i=0}^n\binom{n}{i}(-1)^ik^{n-i}=(k-1)^n. \]

\[\Rightarrow\sum_{a=0}^t\binom{t}{a}=2^n. \]

\[\Rightarrow\sum_{a 是奇数}^t\binom{t}{a}=\sum_{a 是偶数}^t\binom{t}{a}=2^{n-1}. \]

组合数

\[\binom{n}{m}=\frac{n!}{m!(n-m)!} \]

\[\Rightarrow \binom{n}{a,b,n-a-b}=\binom{n}{a}\binom{n-a}{b}\binom{n-a-b}{n-a-b}=\frac{n!}{a!b!(n-a-b)!} \]

数论

关于 \(i\) 的同余方程,\(mi\equiv 0\pmod k\)\([0,k)\) 内有 \(\gcd(m,k)\) 个解。

证明:\(\Rightarrow \frac{m}{d}i\equiv0\pmod{k/d}\)\(d=\gcd(m,k)\)),此时等式两边同时乘上 \(\frac{m}{d}\) 的乘法逆元,得到了原方程的所有解是 \(i\equiv 0\pmod{k/d}\)

所以一共有 \(\frac{k}{k/d}=\gcd(m,k)\) 个解,且都是 \(\frac{k}{\gcd(m,k)}\) 的倍数。

错误做法,容斥系数挂了

solution when \(k\) is odd

这时 \(i\to 2i\) 形成一个双射。设和为 \(2i\) 则我们需要有 \(i\) 这个数在里面。

\[\sum_{i=0}\binom{n}{i}(-1)^i k^{n-i-1} \]

注意致命边界,应为

\[\frac{1}{k}\sum_{i=0}^{n}\binom{n}{i}(-1)^i k^{n-i}-\frac{(-1)^n}{k}+(-1)^n =\frac{(k-1)^n}{k}-\frac{(-1)^n}{k}+(-1)^n\]

最后枚举所有的 \(i\)

\[=(k-1)^n-(-1)^n+k(-1)^n=(k-1)^n+(k-1)(-1)^n \]

solution when \(k\) is even

\(i,i+k/2\to 2i\)

枚举有多少个 \(i,i+k/2\)

\[\sum_a\sum_b(-1)^{a+b}\binom{n}{a,b,n-a-b}k^{n-a-b-1} \]

\[=\sum_t\frac{(-1)^t}{(n-t)!}k^{n-t-1}\sum_{a\leq t}\frac{n!}{a!(t-a)!} \]

\[=\sum_t(-1)^t\frac{n!}{(n-t)!t!}k^{n-t-1}\sum_{a\leq t}\frac{t!}{a!(t-a)!} \]

\[=\sum_t(-1)^t\binom{n}{t}k^{n-t-1}\sum_{a\leq t}\binom{t}{a} \]

\[=\frac{1}{k}\sum_t(-1)^t\binom{n}{t}k^{n-t}2^t \]

\[=\frac{1}{k}\sum_t\binom{n}{t}(-2)^tk^{n-t}=\frac{1}{k}(k-2)^n \]

考虑误差项

\[\Delta=-k^{-1}\sum_{a+b=n}(-1)^n\binom{n}{a}+\sum_{a+b=n,a是偶数}(-1)^n\binom{n}{a} \]

\[=-k^{-1}(-1)^n\sum_{a+b=n}\binom{n}{a}+(-1)^n\sum_{a+b=n,a是偶数}\binom{n}{a} \]

\[=-k^{-1}(-1)^n2^n+(-1)^n2^{n-1} \]

对着以上的东西乘 \(k/2\)

posted @ 2023-03-30 10:47  caijianhong  阅读(88)  评论(0编辑  收藏  举报