ACM刷题之路(十四)逆元取模 Travel along the Line

简介: ACM刷题之路(十四)逆元取模 Travel along the Line

题目链接http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4006


题意:小明在原点(0,0),一共可以走n步,他朋友在(m,0)这个点。小明是随机走步,1/2几率不动,1/4几率往左走一步,1/4几率往右走一步。

问:小明走n次以后在(m,0)这个点的概率的逆元为多少? 结果对1e9+7取余,n、m∈[0,1e5];

PS:P/Q%mod=P*(Q的逆元)%mod。


题解:

什么叫逆元,见下图:需要P为质数,题中1e9+7就是质数符合题意。

我们令i为小明原地不动的步数,但是前提是保证n-i>=m,因为m是有效步数。

首先,总步数是n,i是不动的步数,m是有效的动步数,那么我们设无效的动步数(即来回循环但位移是0的步数)为X。

则 i+m+X=n;

解得X=n-m-i;

这里是组合公式的运用。

在i确定的情况下,

我们先把i步不动的确定下来,就是C(n,i)。

不动的概率是0.5,所以总的是1/2)^i

在动的步数中,分为有效和无效步,如下图所示,我们只需要确定无效步的一种即可,

比如确定无效步的左边,就是c(n-i,n-m-i>>1)

总的动步为n-i,所以总的概率为(1/4)^(n-i);

在i确定的情况下,答案就是C(n,i)*(1/2)^i  *c(n-i,n-m-i>>1)*(1/4)^(n-i);

所以最后i从0或1 遍历到n-m即可,步长为2.

1. #include<iostream>
2. using namespace std;
3. 
4. #define ll long long
5. const ll mod = 1e9 + 7;
6. ll jc[100005];
7. void init()
8. {
9.  jc[0] = 1;
10.   ll ret = 1;
11.   for (ll i = 1; i <= 100000; i++)
12.   {
13.     ret = (ret*i) % mod;
14.     jc[i] = ret;
15.   }
16. }
17. ll qpow(ll a, ll b)
18. {
19.   ll ret = a;
20.   ll ans = 1;
21.   while (b)
22.   {
23.     if (b & 1)
24.       ans = (ans*ret) % mod;
25.     ret = (ret*ret) % mod;
26.     b >>= 1;
27.   }
28.   return ans;
29. }
30. ll c(ll a, ll b)
31. {
32.   return jc[a] * qpow(jc[b] * jc[a - b] % mod, mod - 2) % mod;
33. }
34. int main()
35. {
36.   int t;
37.   scanf("%d", &t);
38.   init();
39.   while (t--)
40.   {
41.     ll n, m, i;
42.     scanf("%lld%lld", &n, &m);
43.     if (m<0)  m = -m;
44. int maxn=n-m;
45.     ll ans = 0;
46.     if (maxn % 2 == 1) i = 1;
47.     else i = 0;
48.     for (; i <= maxn; i += 2)
49.     {
50.       ans = (ans + c(n, i)*c(n - i, n-m-i>>1) % mod*qpow(qpow(4, n-i)*qpow(2, i) % mod, mod - 2) % mod) % mod;
51.     }
52.     printf("%lld\n", ans);
53.   }
54.   return 0;
55. }

 


相关文章
ACM刷题之路(三)dfs+排列 第K个幸运排列
ACM刷题之路(三)dfs+排列 第K个幸运排列
|
6月前
|
测试技术 数据安全/隐私保护
【C/PTA】数组进阶练习(二)
【C/PTA】数组进阶练习(二)
167 0
|
6月前
|
机器学习/深度学习 人工智能
【C/PTA】数组进阶练习(三)
【C/PTA】数组进阶练习(三)
187 0
|
6月前
|
机器学习/深度学习
【C/PTA】数组进阶练习(一)
【C/PTA】数组进阶练习(一)
123 0
ACM刷题之路(二十四)HDU 2844 多重背包转换 Coins
ACM刷题之路(二十四)HDU 2844 多重背包转换 Coins
106 0
|
知识图谱
ACM刷题之路(二十三) HDU 1114 完全背包 Piggy-Bank
ACM刷题之路(二十三) HDU 1114 完全背包 Piggy-Bank
ACM刷题之路(十五) 分治法 + 找规律 ZOJ4085
ACM刷题之路(十五) 分治法 + 找规律 ZOJ4085
106 0
ACM刷题之路(二十一)大素数筛选 2019暑期集训 POJ 2689 Prime Distance
ACM刷题之路(二十一)大素数筛选 2019暑期集训 POJ 2689 Prime Distance
(数学)(必要解题步骤)2021icpc上海D. Strange Fractions
(数学)(必要解题步骤)2021icpc上海D. Strange Fractions
78 0
|
机器学习/深度学习 人工智能 算法
每日一题冲刺大厂第十六天提高组 codeforces 783 div1 Half Queen
大家好,我是泡泡,给大家带来每日一题的目的是为了更好的练习算法,我们的每日一题提高组是为了有余力的同学准备的,让大家练到各种各样的题目,一年以后,蜕变成为一个不一样的自己!
115 0
每日一题冲刺大厂第十六天提高组 codeforces 783 div1 Half Queen