传送门
思路:显然无论怎么交换,最终相同概率的个数是不会变等于 n − 1 n-1 n−1,即每次交换只存在两种概率,而且对于交换 ( x , y ) (x,y) (x,y),就是相当于 p x , p y p_x,p_y px,py概率交换,所以我们可以找到最终那一个唯一的不同的概率的位置,因为初始化 p o s = 1 pos=1 pos=1, 若 ( x , y ) (x,y) (x,y)中有 p o s pos pos,则 p o s pos pos变为另一个位置,接下来我们只考虑没有被看见的交换,显然在这次操作后的位置 i i i有兔子的概率 p ′ p' p′,存在两种情况,该位置原来有兔子,但没有交换它,则此时概率为:
p × n − 2 n , p\times\dfrac{n-2}{n}, p×nn−2,因为是从 n n n个数中选两个数,则没有被选中的概率是 n − 2 2 \dfrac{n-2}{2} 2n−2。
第二种情况,该位置原来没有兔子,但是与它交换的位置有兔子。
首先被选中的概率是 2 n \dfrac{2}{n} n2,然后与它交换的位置有兔子的概率是 1 n − 1 \dfrac{1}{n-1} n−11,( n − 1 n-1 n−1位置等可能性),所以概率是 ( 1 − p ) × 2 n × 1 n − 1 (1-p)\times\dfrac{2}{n}\times\dfrac{1}{n-1} (1−p)×n2×n−11
综上 p ′ = p × n − 2 n + ( 1 − p ) × 2 n × 1 n − 1 p'=p\times\dfrac{n-2}{n}+(1-p)\times\dfrac{2}{n}\times\dfrac{1}{n-1} p′=p×nn−2+(1−p)×n2×n−11
然后用费马小定理转化一下,递推就行了。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+5,M=1e6+5,inf=0x3f3f3f3f,mod=998244353; #define mst(a) memset(a,0,sizeof a) #define lx x<<1 #define rx x<<1|1 #define reg register #define PII pair<int,int> #define fi first #define se second ll ksm(ll a,ll n){ ll ans=1; while(n){ if(n&1) ans=ans*a%mod; a=a*a%mod; n>>=1; } return ans; } struct p{ int id,x,y; }a[N]; int main(){ int t; scanf("%d",&t); while(t--){ int n,m,k; scanf("%d%d%d",&n,&m,&k); int pos=1; ll ans1=1,ans2=0; for(int i=1;i<=k;i++){ int id,x,y; scanf("%d%d%d",&id,&x,&y); if(x==pos) pos=y; else if(pos==y) pos=x; } ll inv1=ksm(n,mod-2)%mod,inv2=ksm(n-1,mod-2)%mod,x=(n-2)*inv1%mod,y=(2*inv1*inv2)%mod; for(int i=1;i<=m-k;i++) { ans1=(ans1*x)%mod+((1-ans1+mod)%mod)*y%mod,ans1%=mod; ans2=(ans2*x)%mod+((1-ans2+mod)%mod)*y%mod,ans2%=mod; } for(int i=1;i<=n;i++) if(pos==i) printf("%lld ",ans1); else printf("%lld ",ans2); printf("\n"); } return 0; }对于 b o u n s : m ≤ 1 0 10 , k ≤ 1 0 5 bouns:m\leq 10^{10},k\leq 10^5 bouns:m≤1010,k≤105,显然可以用数学公式求和。
p ′ = 2 n ( n − 1 ) + ( n − 2 n − 2 n ( n − 1 ) ) × p p'=\dfrac{2}{n(n-1)}+(\dfrac{n-2}{n}-\dfrac{2}{n(n-1)})\times p p′=n(n−1)2+(nn−2−n(n−1)2)×p
令 ( n − 2 n − 2 n ( n − 1 ) ) = k (\dfrac{n-2}{n}-\dfrac{2}{n(n-1)})=k (nn−2−n(n−1)2)=k
2 n ( n − 1 ) = b \dfrac{2}{n(n-1)}=b n(n−1)2=b。
转化为等比数列:
p i + 1 = k p i + b p i + 1 + b k − 1 = k ( p i + b k − 1 ) p_{i+1}=kp_i+b\\p_{i+1}+\dfrac{b}{k-1}=k(p_i+\dfrac{b}{k-1}) pi+1=kpi+bpi+1+k−1b=k(pi+k−1b)
p n + b k − 1 = p 1 × k n − 1 p_n+\dfrac{b}{k-1}=p_1\times k^{n-1} pn+k−1b=p1×kn−1
p n = p 1 × k n − 1 − b k − 1 p_n=p_1\times k^{n-1}-\dfrac{b}{k-1} pn=p1×kn−1−k−1b
呃大概思路是这样,但是有很多细节需要注意。。。还是太菜不会写。