[2019牛客多校第二场][A. Eddy Walker]

题目连接: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 }
View Code
相关文章
相关标签/搜索