B. hat

 

思路:显然无论怎么交换,最终相同概率的个数是不会变等于 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−1k−1b

呃大概思路是这样,但是有很多细节需要注意。。。还是太菜不会写。