题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1119

题意:中文题诶~

思路:这题数据比较大直接暴力肯定是不行咯,通过一部分打表我们不难发现这个矩阵就是由两个杨辉三角构成的,那么求f(n, m)就是求组合数c(m+n-2, m-1)%mod,其中n>=m;

我们令m+n-2=n, m-1=m, 即我们要求c(n, m)=n!/((n-m)!*m!)%mod,为了书写方便,我们再令:a=n!/(n-m)!, b=m!;

那么我们现在要求的就是:(a/b)%mod,除法取模并不能直接计算,我们需要将之转化为乘法取摸运算;

接下来我们可以有两种解法:

解法1:(a/b)%mod=(a*b')%mod,其中b'为b%mod的乘法逆元,求乘法逆元我们直接用exgcd就好了;不过这里还有一个问题需要注意:

a, b两个数本身就已经超过long long了,所以我们不能先直接计算出a, b的值再求逆元;那么我们是否可以在计算a, b的过程中给其取摸呢?

即:((a%mod)/(b%mod))%mod=?((a%mod)*b')%mod,  答案是可以的, 因为:b=1(%mod), 那么有 b%mod=1(%mod),  显然,先给b取摸再求逆是可行的。 所以我们最终要求的就是:((a%mod)*b')%mod;

代码:

 #include <bits/stdc++.h>
#define ll long long
using namespace std; const ll mod=1e9+; void exgcd(ll a, ll b, ll&x, ll&y){
if(!b){
y=, x=;
return;
}
exgcd(b, a%b, y, x);
y-=a/b*x;
} int main(void){
ll n, m, a=, b=, x, y;
cin >> n >> m;
if(n<m){
swap(n, m);
}
n=n+m-, m-=;
for(ll i=n,j=; j<m; j++,i--){
a=i*a%mod;
}
for(ll i=; i<=m; i++){
b=b*i%mod;
}
exgcd(b, mod, x, y);
x=(x%mod+mod)%mod;
cout << a*x%mod << endl;
return ;
}

解法2:

我们先引入费马小定理:对于互质的两个数b, mod, 有:b^(mod-1)=1(%mod)-----1式;

本题要求 x=(a/b)%mod, 即: a/b=x(%mod)-----2式;

联立1,2式,有:a/b*b^(mod-1)=x(%mod), 即:a*b^(mod-2)=x(%mod), 所以:x=a*b^(mod-2) % mod, 我们可以用快速幂求解;

关于上式证明:

1式等价于:b^(mod-1)%mod=1; 即: b^(mod-1)=k*mod+1;

2式等价于:(a/b)%mod=x; 即: a/b=k'*mod+x;

所以有:a/b*b^(mod-1)=k*k'*mod^2+k'*mod+x*k*mod+x;

所以:a/b*b^(mod-1)%mod=x;

所以:a/b*b^(mod-1)=x(%mod), 即原式得证;

代码:

 #include <bits/stdc++.h>
#define ll long long
using namespace std; const ll mod=1e9+; ll get_pow(ll x, ll n){
ll ans=;
while(n){
if(n&){
ans=ans*x%mod;
}
x=x*x%mod;
n>>=;
}
return (ans+mod)%mod;
} int main(void){
ll n, m, a=, b=, x, y;
cin >> n >> m;
if(n<m){
swap(n, m);
}
n=n+m-, m-=;
for(ll i=n,j=; j<m; j++,i--){
a=i*a%mod;
}
for(ll i=; i<=m; i++){
b=b*i%mod;
}
cout << a*get_pow(b, mod-)%mod << endl;
return ;
}

51nod1119(除法取模)的更多相关文章

  1. 51nod1119(除法取模/费马小定理求组合数)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1119 题意:中文题诶- 思路:这题数据比较大直接暴力肯定是不 ...

  2. 除法取模练习(51nod 1119 & 1013 )

    题目:1119 机器人走方格 V2 思路:求C(m+n-2,n-1) % 10^9 +7       (2<=m,n<= 1000000) 在求组合数时,一般都通过双重for循环c[i][ ...

  3. HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)

    传送门:HDU 5895 Mathematician QSC 这是一篇很好的题解,我想讲的他基本都讲了http://blog.csdn.net/queuelovestack/article/detai ...

  4. Re.多项式除法/取模

    前言 emmm又是暂无 前置 多项式求逆 多项式除法/取模目的 还是跟之前一样顾名思义] 给定一个多项式F(x),请求出多项式Q(x)和R(x),满足F(x)=Q(x)∗G(x)+R(x),R项数小于 ...

  5. hdu 3037 费马小定理+逆元除法取模+Lucas定理

    组合数学推推推最后,推得要求C(n+m,m)%p 其中n,m小于10^9,p小于1^5 用Lucas定理求(Lucas定理求nm较大时的组合数) 因为p数据较小可以直接阶乘打表求逆元 求逆元时,由费马 ...

  6. 51nod 1013 3的幂的和 - 快速幂&除法取模

    题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1013 Konwledge Point: 快速幂:https:/ ...

  7. HDU 4633 Who's Aunt Zhang ★(Polya定理 + 除法取模)

    题意 用K个颜色给魔方染色,魔方只能整体旋转并且旋转重合的方案算一种,求一共有多少不同的染色方案. 思路 经典的Polya应用,记住正六面体的置换群就可以了,魔方就是每个大面变成9个小面了而已: 本题 ...

  8. 组合数取模Lucas定理及快速幂取模

    组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1)  , 此时较简单,在O(n2)可承受的情况下组合数的计算可以 ...

  9. HDU4675【GCD of scequence】【组合数学、费马小定理、取模】

    看题解一开始还有地方不理解,果然是我的组合数学思维比较差 然后理解了之后自己敲了一个果断TLE.... 我以后果然还得多练啊 好巧妙的思路啊 知识1: 对于除法取模还需要用到费马小定理: a ^ (p ...

随机推荐

  1. CGRect相关工具函数

    NSStringFromCGRect(aCGRect): CGRectFromString(aString):如果把视图的框架以字符串的形式放在NSUserDefaults里面,那么该方法可以将其转回 ...

  2. javaweb 国际化

    国际化又称为 i18n:internationalization 软件实现国际化,需具备哪些特征:对于程序中固定使用的文本元素,例如菜单栏.导航条等中使用的文本元素.或错误提示信息,状态信息等,需要根 ...

  3. 设置控件全局显示样式 appearance

    iOS5及其以后提供了一个比较强大的工具UIAppearance,我们通过UIAppearance设置一些UI的全局效果,这样就可以很方便的实现UI的自定义效果又能最简单的实现统一界面风格,它提供如下 ...

  4. android-misc-widgets四向(上下左右)抽屉bug修复版--转载

     android-misc-widgets四向(上下左右)抽屉bug修复版 2013-08-04 08:58:13 标签:bug down top panel slidingdrawer 原创作品,允 ...

  5. JMeter-使用Badboy录制Web测试脚本

    JMeter是纯Java编写的软件功能和性.能测试工具,其录制脚本过于笨拙和复杂.而Badboy是用C++开发的动态应用测试工具,其拥有强大的屏幕录制和回放功能,同时提供图形结果分析功能,刚好弥补了J ...

  6. Android中的分页加载

    //----------------------MainActivity中--------------------------------------------------- package com ...

  7. Android中布局文件中使用onClick属性

    安卓开发中,布局文件中的控件有一个属性,是onClick,例如:           <Button             android:id="@+id/button1" ...

  8. [转]程序开发基础学习二(C++ Google Style 命名规则)

    无规矩不成方圆,新的岗位就需要服从团队的编码规则.很开心团队用的是Google的C++编码规则,大概看了下Google 的编码规则,正如九天翔雁说的:“Google的 C++ Style Guide远 ...

  9. 【Android 应用开发】Android 开发 之 JNI入门 - NDK从入门到精通

    NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git -- Java传递参数给C ...

  10. 将所需要的图标排成一列组成一张图片,方便管理。li的妙用

    我在做一个网站的header 但是视频教学里面将电话图标,微信图标,以及每一个英文字母右边的小点拼成一副图. (图片的名字是top_ioc.png)拼成的整个图片作为li的背景.通过移动就可以分别将每 ...