山东省第八届ACM省赛 D.HEX
2017-07-24 10:33
417 查看
题目
题意:给你一个菱形的棋盘,然后从1 1出发,到给定的点,可以走右下,左下,和下三条路。问到给定的点有多少条路;
大致写出一些样例就可以发现这是一个类似杨辉三角的东西,然后很容易发现每一个点都是左上右上的和。但是感觉没什么用处。。。
可以把菱形逆时针旋转45°,然后就成了一个矩形。然后问题就可以转化为从给定的点到1 1点有多少种方法。
以矩形的方式来说,知道这个点的坐标,就可以推出这个点只通过向左和向上的路径的个数为(矩形长+宽)!/(矩形长!*矩形宽!)。
然后再来考虑斜着走的情况。假设斜着走1次,走一个斜的长和宽就全部减一,,然后进行全排列(矩形长+宽+斜着走次数)!/(矩形长!矩形宽!斜!),然后斜着走的次数逐渐增加直到长和宽有一个为0。
然后就是全排列的求解了,需要用乘法
4000
逆元,我本来用的是费马小定理求解乘法逆元,但是超时了(应该是预处理的问题),于是改用了线性求解。
题意:给你一个菱形的棋盘,然后从1 1出发,到给定的点,可以走右下,左下,和下三条路。问到给定的点有多少条路;
大致写出一些样例就可以发现这是一个类似杨辉三角的东西,然后很容易发现每一个点都是左上右上的和。但是感觉没什么用处。。。
可以把菱形逆时针旋转45°,然后就成了一个矩形。然后问题就可以转化为从给定的点到1 1点有多少种方法。
以矩形的方式来说,知道这个点的坐标,就可以推出这个点只通过向左和向上的路径的个数为(矩形长+宽)!/(矩形长!*矩形宽!)。
然后再来考虑斜着走的情况。假设斜着走1次,走一个斜的长和宽就全部减一,,然后进行全排列(矩形长+宽+斜着走次数)!/(矩形长!矩形宽!斜!),然后斜着走的次数逐渐增加直到长和宽有一个为0。
然后就是全排列的求解了,需要用乘法
4000
逆元,我本来用的是费马小定理求解乘法逆元,但是超时了(应该是预处理的问题),于是改用了线性求解。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int fcnt=100101; const long long mod=1000000007; long long fac[fcnt]; long long invv[fcnt]={1,1}; long long inv(long long b)//线性时间求b的逆元 { if(b<=1)return 1; return (mod-mod/b)*inv(mod%b)%mod; } void getfac() { fac[0]=1; for(int i=1; i<fcnt; i++) { fac[i]=fac[i-1]*i%mod; invv[i]=inv(fac[i]);//这里一起预处理,如果边用边求好像会超时? } } /*long long quickpow(long long a,long long b)费马小定理求解乘法逆元 { if(b<0)return 0; long long ret=1; a%=mod; while(b) { if(b&1) ret=(ret*a)%mod; b>>=1; a=(a*a)%mod; } return ret; } long long inv(long long a) { return quickpow(a,mod-2); } long long c(long long n,long long m) { if(n<m) return 0; return fac *inv(fac[m])%mod*inv(fac[n-m])%mod; }*/ int main() { getfac(); int n,m; while(~scanf("%d %d",&n,&m)) { int h,l; int flag=0; if(n%2==0) { flag=1; n++; } int temp=(n+1)/2; h=l=temp;//h和l是菱形转化成的矩形的坐标 temp=m-temp; h-=temp; l+=temp; if(flag==1) h--; h--;//坐标-1是矩形的长宽 l--; int c=0; long long ans=0; while(h>=0&&l>=0) { long long sum=(((((fac[h+l+c]*invv[h])%mod)*invv[l])%mod)*invv[c])%mod; ans=(ans+sum)%mod; h--; l--; c++; } printf("%lld\n",ans); } }
相关文章推荐
- 2017山东省第八届ACM省赛 D. HEX(组合数学)
- 山东省第八届acm省赛D题 HEX
- 山东省第八届acm省赛 HEX
- 山东省第八届acm省赛D题HEX(组合数学)
- 山东省第八届ACM省赛C firework
- 山东省第八届ACM省赛 I 题(Parity check)
- 山东省第八届ACM省赛 F 题(quadratic equation)
- 山东省第八届ACM省赛A.Return of the Nim
- 山东省第八届ACM省赛C题
- HEX----组合数+逆元+思维 山东省第八届省赛D题
- [置顶] 2017年山东省第八届acm省赛总结
- 2017山东省第八届ACM省赛 fireworks(杨辉三角 + 逆元)
- HEX 山东省第八届省赛D题
- hatuoj 1300 HEX----组合数+逆元+思维 山东省第八届省赛D题
- 山东省第八届acm省赛C题 fireworks
- 山东省第八届acm省赛A题 博弈
- 山东省第八届acm省赛 company
- 山东省第八届ACM省赛 Problem.H triangle
- 山东省第八届ACM省赛 F题 quadratic equation (详解)
- SDUT 3895 (山东省第八届ACM省赛C题) fireworks 杨辉三角+乘法逆元