題目連接:https://ac.nowcoder.com/acm/contest/882/Ac++
題目大意:圓上有\(n\)個點,標號從\(0\)到\(n-1\),初始一我的在點\(0\),每次會等機率向左或向右移動一步,若是某一時刻全部點均被訪問過則中止移動,問最終停留在\(m\)點的機率ide
題解:若\(m \neq 0\)且\(n \neq 1\),則\(ans=\frac{1}{n-1}\),具體證實以下函數
若設答案爲\(f(n,m)\),能夠發現這個函數有以下性質:spa
1.函數是關於零點對稱的,即\(f(n,m)=f(n,n-m)\)code
2.若\(m\neq 0,1,n-1\),則\(f(n,m)=\frac{f(n,m-1)+f(n,m+1)}{2}\),畫一下圖就能知道爲何了blog
接着考慮\(n\)的奇偶性,若\(n\)爲奇數,則設\(a=\left \lfloor \frac{n}{2} \right \rfloor,b=\left \lceil \frac{n}{2} \right \rceil,c=b+1\)。能夠發現由如上兩條性質,有\(f(n,a)=f(n,b)\),且\(f(n,b)=\frac{f(n,a)+f(n,c)}{2}\),所以能夠得出\(f(n,a)=f(n,b)=f(n,c)\)。以此類推則能夠得出全部\(f(n,m)\)相等,因此函數取值爲\(\frac{1}{n-1}\)get
若\(n\)爲偶數,則設\(a=\frac{n}{2}-1,b=\frac{n}{2},c=\frac{n}{2}+1\),能夠得出\(f(n,a)=f(n,c)\),且\(f(n,b)=\frac{f(n,a)+f(n,c)}{2}\),一樣能夠推出\(f(n,a)=f(n,b)=f(n,c)\),同理可證\(f(n,m)=\frac{1}{n-1}(m\neq 0)\)it
注意對\(n=1\)的特判便可event
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 #define MOD 1000000007 5 LL T,n,m,ans=1ll; 6 LL qow(LL x,LL y){return y?(y&1?x*qow(x,y-1)%MOD:qow(x*x%MOD,y/2)):1;} 7 int main() 8 { 9 scanf("%lld",&T); 10 while(T--) 11 { 12 LL res; 13 scanf("%lld%lld",&n,&m); 14 if(m==0)res=n>1?0:1; 15 else res=qow(n-1,MOD-2); 16 ans*=res,ans%=MOD; 17 printf("%lld\n",ans); 18 } 19 return 0; 20 }