HDU 4869 求逆元,反转硬币题

来源:互联网 发布:51testing怎么样知乎 编辑:程序博客网 时间:2024/05/22 08:00


题解: 可以直接看别人的。。

= = 多学了个 inv 写法。

#include<stdio.h>  #include<string.h>  #include<iostream>  #include<cmath>  using namespace std;  const int N = 111111;int n,m;const int MOD = 1000000009;long long P[N],inv[N],RP[N];void pre(){inv[0] = inv[1] = 1;P[0] = RP[0] = P[1] = RP[1] = 1;for(int i = 2;i < N; i++){inv[i] = ((MOD - MOD / i) * inv[MOD % i]) % MOD;P[i] = P[i-1] * i % MOD;RP[i] = RP[i-1] * inv[i] % MOD;}}long long C(long long n,long long m){return ((P[n]*RP[m]%MOD)*RP[n-m]%MOD + MOD) % MOD;}int x;int main(){pre();while(cin >> n >> m){int i=0,j=0 , p,q; // i <= jwhile(n--){scanf("%d",&x);if(i >= x) p = i-x;else if(x <= j) p = ((x&1)==(j&1))?0:1;else p = x-j;if(i + x >= m) q = m - (i+x-m);else if(j+x <= m) q = j+x;else q = (((i+x)&1)==(m&1))?m:m-1;i=p, j = q;}long long ans = 0;for(int z = i; z <= j; z+=2){ans += C(m , z);ans %= MOD;}ans = (ans+MOD)%MOD;cout << ans << endl;}return 0;}


0 0
原创粉丝点击