[数学 二项式定理 快速幂] BZOJ 3157 && BZOJ 3516 && BZOJ 4126 国王奇遇记
来源:互联网 发布:mac os bios 编辑:程序博客网 时间:2024/05/06 08:22
膜拜神犇n+e:http://trinkle.is-programmer.com/2015/6/30/the-adventures-of-the-king.100058.html
本题按时间复杂度的不同共有三种解法。
只会O(m2)的方法
#include<cstdio>#include<cstdlib>#include<algorithm>#define P 1000000007using namespace std;typedef long long ll;const int N=1005;ll n,m,inv,mn,nk;ll C[N][N],f[N];inline ll Pow(ll a,ll b){ll ret=1;for (;b;b>>=1,(a*=a)%=P)if (b&1)(ret*=a)%=P;return ret;}int main(){freopen("t.in","r",stdin);freopen("t.out","w",stdout);scanf("%lld%lld",&n,&m);C[0][0]=1;for (int i=1;i<=m;i++) {C[i][0]=1;for (int j=1;j<=i;j++)(C[i][j]=C[i-1][j]+C[i-1][j-1])%=P;}if(m==1) return printf("%lld\n",(ll)n*(n+1)/2%P),0;mn=Pow(m,n+1);inv=Pow(m-1,P-2);(f[0]=(mn-1)*inv-1)%=P;nk=1;for (int k=1;k<=m;k++) {for(int j=0;j<k;j++)(f[k]+=C[k][j]*((k^j)&1?-1:1)*f[j])%=P;(nk*=n)%=P;f[k]=(nk*mn+f[k])%P*inv%P;}printf("%lld\n",f[m]);return 0;}
本题 m2logn的想法也很不错
#include<cstdio>#include<cstdlib>#include<algorithm>#include<vector>using namespace std;typedef long long ll;typedef vector<ll> Vec;const int P=1e9+7;const int M=200;int n,m;ll C[M+5][M+5];inline void Pre(){ C[0][0]=1; for (int i=1;i<=M;i++){ C[i][0]=1; for (int j=1;j<=M;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%P; }}inline ll Pow(ll a,int b){ ll ret=1; for (;b;b>>=1,a=a*a%P) if (b&1) ret=ret*a%P; return ret;}inline Vec Solve(int n){ Vec tmp,ret; ret.resize(m+5); if (n==1){ for (int i=0;i<=m;i++) ret[i]=m; } else if ((n&1) || n==2){ tmp=Solve(n-1); for (int i=0;i<=m;i++) ret[i]=tmp[i]+Pow(n,i)*Pow(m,n)%P,ret[i]%=P; } else{ tmp=Solve(n/2); for (int i=0;i<=m;i++){ ll tem=0; for (int j=0;j<=i;j++)tem+=C[i][j]*Pow(n>>1,i-j)%P*tmp[j],tem%=P; ret[i]=tmp[i]+tem*Pow(m,n>>1)%P,ret[i]%=P; } } //printf("%d\n",n); for (int i=0;i<=m;i++) printf("%lld ",ret[i]); printf("\n"); return ret;}int main(){ freopen("t.in","r",stdin); freopen("t.out","w",stdout); Pre(); scanf("%d%d",&n,&m); printf("%lld\n",Solve(n)[m]); return 0;}
0 0
- [数学 二项式定理 快速幂] BZOJ 3157 && BZOJ 3516 && BZOJ 4126 国王奇遇记
- 【BZOJ 3157】【BZOJ 3516】国王奇遇记
- bzoj: 3157 bzoj: 3516 bzoj: 4126 国王奇遇记 线性插值法
- 【BZOJ 3157, 3516, 4126】 国王奇遇记 - 极致的组合数学
- BZOJ 3157 国王奇遇记 & BZOJ 3516 国王奇遇记加强版
- [矩阵 二项式定理 单位根 构造 数学神题] BZOJ 3328 PYXFIB
- BZOJ 1409 快速幂+欧拉定理
- BZOJ 1008: [HNOI2008] 越狱 数学 快速幂
- BZOJ 3328: PYXFIB 二项式定理 原根 构造
- [数论][二项式定理][矩阵乘法] BZOJ 3328: PYXFIB
- 3157: 国王奇遇记
- BZOJ 3997 TJOI2015 组合数学 Dilworth定理
- BZOJ 2982 浅谈组合数学Lucas定理
- BZOJ-2326 数学作业 矩阵乘法快速幂+快速乘
- bzoj 4766: 文艺计算姬 矩阵树定理+快速幂
- bzoj 1951: [Sdoi2010]古代猪文 费马小定理+中国剩余定理+lucas定理+快速幂
- BZOJ 1951 费马小定理 + Lucas定理 + 乘法逆元 + 中国剩余定理 + 快速幂
- [BZOJ ]
- [c++]traits
- c3p0源码解析 七 (C3P0PooledConnection类)
- android Volley 框架详解
- Solr实践
- 写在面试腾讯实习生失败之后
- [数学 二项式定理 快速幂] BZOJ 3157 && BZOJ 3516 && BZOJ 4126 国王奇遇记
- String、StringBuilder与StringBuffer源码分析
- JSF 提交报错javax.servlet.ServletException:
- MYSQL 分组合并函数
- Linux常用命令
- MYSQL中取当前年份的第一天和当前周,月,季度的第一天/最后一天
- HDU 1846 Brave Game
- DecimalFormat用法
- Excel表格文本格式的数字和数字格式如何批量转换