hdu 4869
2015-07-02 17:49
330 查看
思维:
根据观察。发现,最后,片材的数量是积极的一些间隔2连续数。这个标题被分成两部分,1 数字解决范围后,张某转正。2 组合的数目来解决。
1。只注重的张前张数求解正范围内的最小和最大数目,详细变换关系可以自己推敲。
2,当组合的数量,由于数据量大且取模,所以要避免正常的除法求解的公式,这里线性求解,除法处理上改为乘法 (a/b) %M=a*(b^(M-2))%M
根据观察。发现,最后,片材的数量是积极的一些间隔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; }
相关文章推荐
- C#实现进程管理的启动和停止实例
- 不损害他人就行
- iOS Provisioning Profile(Certificate)与Code Signing详解
- JSONObject
- openssl之BIO系列之21---Base64类型的BIO
- openssl之BIO系列之20---缓冲(buffer)类型BIO
- java java 内部类
- NYOJ 871 比赛
- redis 主从 集群配置
- 举例详解Linux系统下Pure-ftpd的使用方法
- openssl之BIO系列之19---Filter类型的NULL型BIO
- openssl之BIO系列之18---接受(accept)类型BIO
- iOS中使用blend改变图片颜色
- 为什么使用<!DOCTYPE HTML>
- CentOS7安装Docker,运行Nginx镜像、Centos镜像
- android开发教程21篇(强烈推荐,几乎每一篇都是精华教程)
- 递归问题解决二叉树问题
- ZooKeeper权限配置
- 深入理解ceph-disk的工作机制
- openssl之BIO系列之17---连接(connect)类型BIO