CodeForces-696C Please(数学题,快速幂取模,乘法逆元)
来源:互联网 发布:域名注册服务商查询 编辑:程序博客网 时间:2024/06/07 09:17
题目链接戳这个:http://codeforces.com/problemset/problem/696/C
题目大意:
Barney闲的蛋疼在玩游戏,他把三个杯子放在桌子上,其中中间那个杯子有个钥匙。Barney从两边的杯子中等概率随机选取一个,跟中间的那个杯子交换,称为一轮操作。问经过n轮操作后,中间的杯子里有钥匙的概率多大?
因为n可能非常大,所以输入一个数组
输出为x/y,其中x,y互质且是对
题目分析:
高中数学大家都没忘吧,设
(顺便我在OEIS里面查了,x那个数列叫做Jacobsthal sequence,在组合数学里面是个重要序列。)
Jacobsthal sequence有一个性质,那就是它们都是奇数(很容易证明,因为Jacobsthal序列还有一种递推表示方法是
我们可以随着输入(因为题目出的很巧妙,n是数组连乘而不是连加,不然应该是用快速乘法取模)用快速幂取模算法求出
离线算出2关于1e9+7的逆元为500000004,3关于1e9+7的逆元为333333336。
AC代码:
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M=1e9+7;ll qpow(ll a,ll b){ ll res = 1; while(b){ if(b&1) res = res * a %M; a = a * a % M; b >>= 1; } return res;}int main() { int n; scanf("%d", &n); ll num,t=2,flag=-1; while(n--) { scanf("%I64d", &num); t=qpow(t,num); if(num%2==0) //有一个是偶数,则最后乘起来的n就是偶数 flag=1; } ll y=t*500000004%M; ll x=(333333336*(y+flag))%M; printf("%I64d/%I64d\n",x,y);}
补充:
快速幂取模的模板就是本题的qpow(ll a,ll b)
函数,可以求出
乘法逆元的概念:
我们都知道,加法,减法,乘法都对取模运算满足分配率,唯独除法不可以。即:
那么如何处理
#include <bits/stdc++.h>const int N=1000000007;int egcd(int a,int b,int &x,int &y){ if(!b) { x=1;y=0;return a; } int ans=egcd(b,a%b,x,y); int temp=x; x=y; y=temp-a/b*y; return ans;}int cal(int a,int m=N){ int x,y; int gcd=egcd(a,m,x,y); if(1%gcd!=0) return -1; x*=1/gcd; m=abs(m); int ans=x%m; if(ans<=0) ans+=m; return ans;}int main() { int n; scanf("%d",&n); printf("%d关于%d的乘法逆元是%d.\n", n,N,cal(n));}
其中函数cal(int x,int y=M)
就是计算x关于y(默认为M=1e9+7)的乘法逆元。
- CodeForces-696C Please(数学题,快速幂取模,乘法逆元)
- CodeForces 300C Beautiful Numbers (乘法逆元+快速幂(含乘法逆元的讲解))
- codeforces PLEASE 逆元快速幂
- CodeForces 300C Beautiful Numbers(乘法逆元/费马小定理+组合数公式+快速幂)
- Codeforces 521C 组合数取模(乘法逆元)
- Codeforces 696C. PLEASE(快速幂+费马小定理)
- codeforces 300C 乘法逆元 (乘法逆元模为素数的模板)
- Codeforces 300C Beautiful Numbers 乘法逆元
- Codeforces 696C PLEASE(数论)
- CodeForces 300CBeautiful Numbers(排列组合 乘法逆元)
- 快速幂+乘法逆元+二项式定理(hdu 5793)
- codeforces 732C Sanatorium(数学题)
- codeforces-327C Magic Five(等比数列求和+快速幂+逆元)
- CodeForces Round #191 (327C) - Magic Five 乘法逆元与费马小定理
- CodeForces Round #191 (327C) - Magic Five 乘法逆元与费马小定理
- Codeforces Round #295 (Div. 1) C. Pluses everywhere (组合数学+乘法逆元)
- Codeforces 327C 乘法逆元 + 费马小定理 || 等比数列二分求和取模
- 扩展欧几里德算法求乘法逆元(C语言版)
- 1119 Collecting Coins 湖南省第八届
- poj2524 Ubiquitous Religions
- VS2013配置opencv
- [机器学习笔记]Note16--应用示例:图像文字识别
- 解决Emacs无法输入中文的问题
- CodeForces-696C Please(数学题,快速幂取模,乘法逆元)
- 1.搜索之路——Nutch与Lucene
- C++ 值传递、指针传递、引用传递详解
- 体验标签的用法
- 2.搜索之路——Nutch搭建
- redis消息订阅和发布实例
- 机器学习-梯度下降算法-特征缩放和学习速率选取
- 3.搜索之路——solr
- Persistent and Transient Data Structures in Clojure