您的位置:首页 > 其它

hdu 4869

2015-07-02 17:49 330 查看
思维:

根据观察。发现,最后,片材的数量是积极的一些间隔2连续数。这个标题被分成两部分,1 数字解决范围后,张某转正。2 组合的数目来解决。

1。只注重的张前张数求解正范围内的最小和最大数目,详细变换关系可以自己推敲。

2,当组合的数量,由于数据量大且取模,所以要避免正常的除法求解的公式,这里线性求解,除法处理上改为乘法 (a/b) %M=a*(b^(M-2))%M

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const long long M=1e9+9;
long long c[111111];
long long quickpow(long long m,long long n,int k)
{
long long b = 1;
while (n > 0)
{
if (n & 1)
b = (b*m)%k;
n = n >> 1 ;
m = (m*m)%k;
}
return b%k;
}
int m,n,x;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int mi=0,ma=0;
int a,b;
for(int i=0; i<n; i++)
{
scanf("%d",&x);
if(mi-x>=0)a=mi-x;
else if(ma-x>=0)
{
if(mi%2==x%2)a=0;
else a=1;
}
else a=x-ma;
if(ma+x<=m)b=ma+x;
else if(mi+x<=m)
{
if((mi+x)%2==m%2)b=m;
else b=m-1;
}
else b=m-(x-(m-mi));
mi=a;
ma=b;
}
long long mu=m,zi=1,xx,yy;
c[0]=1;
for(int i=1;i<=m;i++)
{
if(m-i<i)c[i]=c[m-i];
else
{
c[i]=(c[i-1]*(m-i+1))%M*quickpow((long long)i,M-2,M)%M;
}
}
long long ans=0;
for(int i=mi;i<=ma;i+=2)
{
ans+=c[i];
ans%=M;
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: