LightOJ 1132 Summing up Powers:矩阵快速幂 + 二项式定理
2024-08-27 12:45:29
题目链接:http://lightoj.com/volume_showproblem.php?problem=1132
题意:
给定n、k,求(1K + 2K + 3K + ... + NK) % 232。
题解:
设sum(i) = 1K + 2K + 3K + ... + iK
所以要从sum(1)一直推到sum(n)。
所以要找出sum(i)和sum(i+1)之间的关系:
好了可以造矩阵了。
(n = 6时)
矩阵表示(大小为 1 * (k+2)):
初始矩阵start:
也就是:
特殊矩阵special:
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_L 60
#define MAX_K 55 using namespace std; struct Mat
{
int n;
int m;
unsigned val[MAX_L][MAX_L];
Mat()
{
n=;
m=;
memset(val,,sizeof(val));
}
void print_mat()
{
cout<<"--------"<<endl;
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
cout<<val[i][j]<<" ";
}
cout<<endl;
}
cout<<"--------"<<endl;
}
}; int k,t;
long long n;
unsigned c[MAX_K][MAX_K]; void cal_combination()
{
memset(c,,sizeof(c));
c[][]=;
for(int i=;i<MAX_K;i++)
{
c[i][]=;
for(int j=;j<=i;j++)
{
c[i][j]=c[i-][j]+c[i-][j-];
}
}
} Mat make_unit(int n)
{
Mat mat;
mat.n=n;
mat.m=n;
for(int i=;i<n;i++)
{
mat.val[i][i]=;
}
return mat;
} Mat make_start(int k)
{
Mat mat;
mat.n=;
mat.m=k+;
for(int i=;i<k+;i++)
{
mat.val[][i]=;
}
return mat;
} Mat make_special(int k)
{
Mat mat;
mat.n=k+;
mat.m=k+;
for(int j=;j<k+;j++)
{
for(int i=j;i<k+;i++)
{
mat.val[i][j]=c[k-j+][i-j];
}
}
for(int i=;i<k+;i++)
{
mat.val[i][]=mat.val[i][];
}
mat.val[][]=;
return mat;
} Mat mul_mat(const Mat &a,const Mat &b)
{
Mat c;
if(a.m!=b.n)
{
cout<<"Error: mul_mat"<<endl;
return c;
}
c.n=a.n;
c.m=b.m;
for(int i=;i<a.n;i++)
{
for(int j=;j<b.m;j++)
{
for(int k=;k<a.m;k++)
{
c.val[i][j]+=a.val[i][k]*b.val[k][j];
}
}
}
return c;
} Mat quick_pow_mat(Mat mat,long long k)
{
Mat ans;
if(mat.n!=mat.m)
{
cout<<"Error: quick_pow_mat"<<endl;
return ans;
}
ans=make_unit(mat.n);
while(k)
{
if(k&)
{
ans=mul_mat(ans,mat);
}
mat=mul_mat(mat,mat);
k>>=;
}
return ans;
} int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
cal_combination();
cin>>t;
for(int cas=;cas<=t;cas++)
{
cin>>n>>k;
Mat start=make_start(k);
Mat special=make_special(k);
Mat ans=mul_mat(start,quick_pow_mat(special,n-));
cout<<"Case "<<cas<<": "<<ans.val[][]<<endl;
}
}
最新文章
- iOS 疑难杂症 — — 在 Storyboard 里 Add Size Class Customization 后再从代码里无法修改的问题
- 理解Kalman滤波的使用
- Adding a WebPart to a SharePoint 2013 Master Page 分类: Sharepoint 2015-07-08 01:03 7人阅读 评论(0) 收藏
- (地址)eclipse插件开发攻略的访问地址
- I do not want to inherit the child opacity from the parent in CSS(不想让子元素继承父元素的透明度)
- 快速搭建Redis缓存数据库
- Eclipse中新建WEB项目,JSP页面报错。
- shell script 基本语法
- Mac与Linux的一个巨大不同
- Session案例
- ASP.NET中连接数据库的各种方法
- Linux 远程查看tomcat控制台
- 多线程学习之一独木桥模式Single Threaded Execution Pattern
- 用户单独管理Jenkins的某些项目
- 201521123075 《Java程序设计》第2周学习总结
- (NO.00002)iOS游戏精灵战争雏形(五)
- 操作系统,时间片轮转算法的C语言实现Round Robin
- keras中的重要函数
- .apply()用法和call()的区别
- git 28原则
热门文章
- Ubuntu下安装JDK图文解析
- 网络电台(WIZ550io)
- Cocos2d-x 更改文字换行风格 ( cocos2dx change line )
- c# .net 我的Application_Error 全局异常抓取处理
- HDFS源码分析心跳汇报之整体结构
- C#泛型<;T>;说明
- 再说WCF Data Contract KnownTypeAttribute
- EasyPlayerPro windows播放器本地音频播放音量控制实现
- Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)
- jQuery学习笔记(9)--jquery中的事件--$(document).ready()