bzoj3157国王奇遇记(秦九韶算法+矩乘)&&bzoj233AC达成
bz第233题,用一种233333333的做法过掉了(为啥我YY出一个算法来就是全网最慢的啊...)
题意:求sigma{(i^m)*(m^i),1<=i<=n},n<=10^9,m<=200
别人的做法: O(m^2logn),O(m^2),甚至O(m)的神做法
学渣的做法:矩乘+秦九韶算法,O(m^3logn),刚好可以过最弱版本的国王奇遇记的数据
(极限数据单点其实是1.2s+,不想继续卡常了…bzoj卡总时限使人懒惰…如果把矩乘的封装拆掉可能会快点吧,然而人弱懒得拆了...)
首先考虑这么一道题:求sigma{i*(m^i),1<=i<=n},n<=10^9
举一个m=2,n=4的例子:
sigma{i*(m^i),1<=i<=n} = 1*(2^1)+2*(2^2)+3*(2^3)+4*(2^4)
= 2*(1+2*(2^1)+3*(2^2)+4*(2^3))
= 2*(1+2*(2+3*2+4*2^2))
= 2*(1+2*(2+2*(3+4*2)))
从括号最里面向外计算,那么只需要从0的基础上,依次加4乘2;加3乘2;加2乘2;加1乘2。
这样的运算是很有规律的,我们可以构造一个矩阵用矩阵快速幂来进行计算.
如果是sigma{i*i*(m^i),1<=i<=n}?我们需要在矩阵中保存一个i^2,这时候利用(i-1)^2=i^2-2*i+1,在矩阵中同时保存i和i^2即可
对于国王奇遇记这道题,我们需要从0的基础上,依次加n^m再乘m;加(n-1)^m再乘m,加(n-2)^m再乘m…..
看似矩阵中从n^m到(n-1)^m的转换较难完成
利用二项式定理,在矩阵中存储n^1,n^2,n^3,…n^m,就可以完成转移.
#include<cstdio>
#include<cstring>
//#include<ctime>
#include<algorithm>
using namespace std;
const int mod=,maxn=;
int sz;
struct matrix{
int a[maxn][maxn];
matrix(){
memset(a,,sizeof(a));
}
matrix(int x){
memset(a,,sizeof(a));
for(int i=;i<maxn;++i)a[i][i]=;
}
matrix operator *(const matrix &B)const{
matrix C;
for(int i=;i<=sz;++i){
for(int j=;j<=sz;++j){
if(a[i][j]==)continue;
for(int k=;k<=sz;++k){
if(B.a[j][k]==)continue;
C.a[i][k]=(C.a[i][k]+a[i][j]*1LL*B.a[j][k])%mod;
}
}
}
return C;
}
}A,ANS(),B;
int n,m;
void build_matrix(){
A.a[][]=;
for(int i=;i<sz;++i){
A.a[][i]=;
for(int j=;j<=i;++j){
A.a[j][i]=(A.a[j-][i-]+A.a[j][i-])%mod;
}
}
for(int i=;i<sz;++i){
for(int j=;j<=i;++j){
if((j^i)&)A.a[j][i]=(mod-A.a[j][i])%mod;
}
}
A.a[sz][sz]=m;A.a[sz-][sz]=;
// for(int i=0;i<=sz;++i){
// for(int j=0;j<=sz;++j)printf("%d ",A.a[i][j]);
// printf("\n");
// }
}
void quickpow(int x){
// double t1=clock();
for(;x;x>>=,A=A*A){//printf("!");
if(x&)ANS=ANS*A;
}
// double t2=clock();
}
int pwr[maxn];
int main(){
scanf("%d%d",&n,&m);
pwr[]=;
for(int i=;i<=m;++i){
pwr[i]=pwr[i-]*1LL*n%mod;
}
sz=m+;
build_matrix();
quickpow(n);
int ans=;
for(int i=;i<=m;++i){
ans=(ans+ANS.a[i][sz]*1LL*pwr[i])%mod;
}
printf("%lld\n",ans*1LL*m%mod);
return ;
}
bzoj3157国王奇遇记(秦九韶算法+矩乘)&&bzoj233AC达成的更多相关文章
- bzoj3157: 国王奇遇记
emmm...... 直接看题解好了: BZOJ-3157. 国王奇遇记 – Miskcoo's Space O(m)不懂扔掉 总之,给我们另一个处理复杂求和的方法: 找到函数之间的递推公式! 这里用 ...
- BZOJ3157: 国王奇遇记 & 3516: 国王奇遇记加强版
令\[S_i=\sum_{k=1}^n k^i m^k\]我们有\[\begin{eqnarray*}(m-1)S_i & = & mS_i - S_i \\& = & ...
- 扰动法--*BZOJ3157: 国王奇遇记
求$\sum_{i=1}^ni^mm^i$.$n \leq 1e9,m \leq 200$. 其实我也不知道这东西为啥叫“扰动法”,大概是在黑暗的边缘试探?就是那种,人家再多一点就被您看破了,然后您就 ...
- BZOJ3157 国王奇遇记——神奇的推式子
先膜一发Miskcoo,大佬的博客上多项式相关的非常全 原题戳我 题目大意 求 \[\sum\limits_{i=1}^{n}i^mm^i\] 题解 设一个函数\(f(i)=\sum\limits_{ ...
- 【BZOJ3157/3516】国王奇遇记(数论)
[BZOJ3157/3516]国王奇遇记(数论) 题面 BZOJ3157 BZOJ3516 题解 先考虑怎么做\(m\le 100\)的情况. 令\(f(n,k)=\displaystyle \sum ...
- 【BZOJ】【3157】&【BZOJ】【3516】国王奇遇记
数论 题解:http://www.cnblogs.com/zhuohan123/p/3726933.html copy一下推导过程: 令$$S_i=\sum_{k=1}^{n}k^im^k$$ 我们有 ...
- BZOJ3157/BZOJ3516 国王奇遇记(矩阵快速幂/数学)
由二项式定理,(m+1)k=ΣC(k,i)*mi.由此可以构造矩阵转移,将mi*ik全部塞进去即可,系数即为组合数*m.复杂度O(m3logn),因为大常数喜闻乐见的T掉了. #include< ...
- 【BZOJ4126】【BZOJ3516】【BZOJ3157】国王奇遇记 线性插值
题目描述 三倍经验题. 给你\(n,m\),求 \[ \sum_{i=1}^ni^mm^i \] \(n\leq {10}^9,1\leq m\leq 500000\) 题解 当\(m=1\)时\(a ...
- bzoj3157 3516 国王奇遇记
Description Input 共一行包括两个正整数N和M. Output 共一行为所求表达式的值对10^9+7取模的值. 特判m=1 m≠1时: 设S[u]=sigma(i^u*m^i) m*S ...
随机推荐
- linux(八)__yum工具
自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载.安装. 什么是yum? yum工具实例: 因为yum指定的软件仓库源是国外的网站,在国内访问较慢.我们更改它的仓库源. 首先先备 ...
- Linux网络查看命令
1.ifconfig 查看当前生效的网卡. 2.ifdown ifup 网卡禁用与启动. 3.netstat -tuln 查看当前tcp/udp通讯端口连接情况. 4.netstat -an 查看当前 ...
- JS+CSS3人物奔跑动画
查看效果:http://hovertree.com/texiao/jquery/58/ 效果图: 代码: <!DOCTYPE html> <html> <head> ...
- 谈一谈前端多容器(多webview平台)处理方案
文中是我个人的一些开发经验,希望对各位有用,也希望各位多多支持讨论,指出文中不足以及提出您的一些建议. 双容器 得益于近几年移动端的发展,前端早已今非昔比,从大型框架来说angularJS.react ...
- VisualStudio 调试Linux
微软自从换了CEO之后,拥抱开源的步伐真实越来越快了,这部,现在VS可以跟踪Linux程序了 http://blogs.msdn.com/b/vcblog/archive/2015/11/18/ann ...
- [Modern OpenGL系列(一)]十步搞定OpenGL开发环境
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51292143 OpenGL官网:https://www.opengl.or ...
- Java中堆内存和栈内存详解2
Java中堆内存和栈内存详解 Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...
- 实现CheckBox的三种选中状态(全选、半选、不选)在GridView中模拟树形的功能
度娘了很多帖子,只说三种状态要用图片替换来做,但没找到有用的例子,被逼自己写了一个 三方控件肯定是很多的,如jstree,可以直接用 由于公司的UDS限制,不能上传图片,只能文字说明了. 就是要在gr ...
- php-into 安装时遇到的各种问题,php -m跟phpinfo()显示不一致
系统环境 阿里云服务器 ubuntu nginx php5.4.23 在Yii2中格式显示用户currency,所以需要intl模块,没啥说的装吧. apt-get install libicu-de ...
- 不同数据库,查询前n条数据的SQL语句
不同的数据库,支持的SQL语法略有不同,以下是不同数据库查询前n条数据的SQl语句 SQL Server(MSSQL) SELECT TOP n * FROM table_name ORACLE SE ...