sdutoj 3896 HEX 思维+组合数

来源:互联网 发布:知乎live结束后能看吗 编辑:程序博客网 时间:2024/06/14 03:27

题目链接

题意:

问你从(1,1)到(a,b)有几种走法

思路;

这个题我们集训队的大佬提供了很好的思路,我们起始位置在(1,1)可以走到(2,1) (3,2)(2,2)

坐标分别增加了(1,0) (2,1) (1,1) 我们可以将三个看成三个向量 对于要达到的目的(a,b)可以列出一个

等式: x(1,0)+y(2,1)+z(1,1)+(1,1)=(a,b)  可以列出两个方程.x+2*y+z=a-1,y+z=b-1. (x,y,z分别表示往(1,0),(2,1),(1,1)方向走了几次),那么可以的到走法为C(x+y+z,x)*C(y+z,y)*C(z,z)。因为只有两个方程三个未知数

所以我们需要枚举一个然后求结果.a,b最多为1e5,组合数问题用费马小定理求逆元来解决就可以了

#include<bits/stdc++.h>#define Ri(a) scanf("%d", &a)#define Rl(a) scanf("%lld", &a)#define Rf(a) scanf("%lf", &a)#define Rs(a) scanf("%s", a)#define Pi(a) printf("%d\n", (a))#define Pf(a) printf("%lf\n", (a))#define Pl(a) printf("%lld\n", (a))#define Ps(a) printf("%s\n", (a))#define W(a) while(a--)#define CLR(a, b) memset(a, (b), sizeof(a))#define MOD 1000000007#define inf 0x3f3f3f3f#define exp 0.00000001#define  pii  pair<int, int>#define  mp   make_pair#define  pb   push_backusing namespace std;typedef long long ll;const int maxn=1e5+10;ll f[maxn+1],inv[maxn+1];int a,b,x,y,z;ll quickpow(ll w,ll l){ll ans=1;while(l){if(l&1)ans=(ans*w)%MOD;l=l/2;w=(w*w)%MOD;}return ans;}void init(){f[0]=1;inv[0]=1;for(int i=1;i<=maxn;i++){   f[i]=(f[i-1]*i)%MOD;   inv[i]=quickpow(f[i],MOD-2)%MOD;}return ;}ll C(int n,int k){if(n<k)return 0;ll res=(f[n]*inv[k]%MOD*inv[n-k])%MOD;return res;}int main(){init();while(~Ri(a)){Ri(b);x=0,y=0,z=0;ll ans=0;for(x=0;x<=a;x++){z=a-b-x;y=2*b-a-1+x;if(z<0||y<0)continue;ans=(ans+C(x+y+z,x)*C(y+z,y))%MOD;}Pl(ans);}return 0;}/***************************************************User name: ¸ÖÌúÏÀResult: AcceptedTake time: 364msTake Memory: 1776KBSubmit time: 2017-05-10 21:29:03****************************************************/

1 0
原创粉丝点击