您的位置:首页 > 其它

HDU 4869 求逆元,反转硬币题

2014-07-23 22:39 567 查看
题解: 可以直接看别人的。。

= = 多学了个 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
,inv
,RP
;
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
*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 <= j
while(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息