2017山东省赛D题(SDUT3896逆元法求组合数)
来源:互联网 发布:如何当淘宝模特 编辑:程序博客网 时间:2024/06/14 12:45
从大佬这学到了,这个大佬好厉害
题意:给你一个菱形的棋盘,然后从1 1出发,到给定的点,可以走右下,左下,和下三条路。问到给定的点有多少条路;
大致写出一些样例就可以发现这是一个类似杨辉三角的东西,然后很容易发现每一个点都是左上右上的和。但是感觉没什么用处。。。
可以把菱形逆时针旋转45°,然后就成了一个矩形。然后问题就可以转化为从给定的点到1 1点有多少种方法。
以矩形的方式来说,知道这个点的坐标,就可以推出这个点只通过向左和向上的路径的个数为(矩形长+宽)!/(矩形长!*矩形宽!)。
然后再来考虑斜着走的情况。假设斜着走1次,走一个斜的长和宽就全部减一,,然后进行全排列(矩形长+宽+斜着走次数)!/(矩形长!矩形宽!斜!),然后斜着走的次数逐渐增加直到长和宽有一个为0。
然后就是全排列的求解了,需要用乘法逆元,我本来用的是费马小定理求解乘法逆元,但是超时了(应该是预处理的问题),于是改用了线性求解。
代码用线性方法求逆元,费马定理也可以,不过都需要预处理,不然都会超时
详解看这里
code:
线性方法
#include<cstdio>#include<iostream>using namespace std;typedef long long ll;const int maxn=101010;const ll mod=1000000007;ll jiec[maxn];ll invi[maxn];ll inv(ll a){ if(a<=1) return 1; return inv(mod%a)*(mod-mod/a)%mod;}int main(){ jiec[0]=1; invi[0]=1; invi[1]=1; for(int i=1;i<maxn;i++) { jiec[i]=jiec[i-1]*i%mod; invi[i]=inv(jiec[i]); } ll x,y; while(cin>>x>>y) { ll l,r,c; l=y-1; r=x-y; c=0; ll res=0; while(r>=0&&l>=0) { ll temp=((jiec[l+r+c]*invi[l]%mod)*invi[r])%mod*invi[c]; temp%=mod; res=(res+temp)%mod; l--; r--; c++; } cout<<res<<endl; } return 0;}
费马小定理
#include<cstdio>#include<iostream>using namespace std;typedef long long ll;const int maxn=101010;const ll mod=1000000007;ll jiec[maxn];ll invi[maxn];ll kuaisumi(ll a,ll b) { ll ans=1; while(b) { if(b&1) { b--; ans=(ans*a)%mod; } b=b>>1; a=(a*a)%mod; } ans=ans%mod; return ans; } ll inv(ll a){ if(a<=1) return 1; return kuaisumi(a,mod-2);}int main(){ jiec[0]=1; invi[0]=1; invi[1]=1; for(int i=1;i<maxn;i++) { jiec[i]=jiec[i-1]*i%mod; invi[i]=inv(jiec[i]); } ll x,y; while(cin>>x>>y) { ll l,r,c; l=y-1; r=x-y; c=0; ll res=0; while(r>=0&&l>=0) { ll temp=((jiec[l+r+c]*invi[l]%mod)*invi[r])%mod*invi[c]; temp%=mod; res=(res+temp)%mod; l--; r--; c++; } cout<<res<<endl; } return 0;}
阅读全文
0 0
- 2017山东省赛D题(SDUT3896逆元法求组合数)
- 2017山东省赛C题(SDUT3895逆元法求组合数)
- HEX----组合数+逆元+思维 山东省第八届省赛D题
- hatuoj 1300 HEX----组合数+逆元+思维 山东省第八届省赛D题
- 山东省赛二组合数dp
- 2017 ACM山东省赛 D
- 2017山东省第八届ACM省赛 D. HEX(组合数学)
- fireworks 2017年山东省ACM省赛C题 SDUT 3895 (逆元求组合数)
- 2017山东省-D-Hex
- Sdut 2164 Binomial Coeffcients (组合数学) (山东省ACM第二届省赛 D 题)
- 山东省第八届acm省赛D题HEX(组合数学)
- 山东省第三届省赛D题
- 端午节个人赛-山东省省赛 fireworks(杨辉三角形+组合数+逆元)
- 第八届山东省赛 C sdut 3895 fireworks(组合数+逆元)
- 2017年山东省第八届ACM大学生程序设计竞赛 C fireworks(sdut 3895) 逆元求组合数
- HEX SDUT 3896 17年山东省赛D题
- HEX 山东省第八届省赛D题
- 2017山东省赛B题Quadrat
- 二叉树
- 第一篇博客
- spring框架
- opendaylight-Boron-SR3开发入门实例
- Lint 静态代码检查工具
- 2017山东省赛D题(SDUT3896逆元法求组合数)
- 去掉未引用的类
- 奇异值分解与最小二乘问题
- 滑动窗口的最大值(C++/Java)
- 【muduo】进程信息
- 蓝牙的配对和连接的建立过程
- multimap getline 写家族关系表 作家与图书的关系 通讯录
- Python检测和处理异常
- 【bzoj2288】【POJ Challenge】生日礼物