Educational Codeforces Round 60 (Rated for Div. 2) D. Magic Gems(矩阵快速幂)
2024-10-07 08:28:42
题意:
一个魔法水晶可以分裂成m个水晶,求放满n个水晶的方案数(mol1e9+7)
思路:
线性dp,dp[i]=dp[i]+dp[i-m];
由于n到1e18,所以要用到矩阵快速幂优化
注意初始化
代码:
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
typedef long long ll;
#define MAX 105
const int N=;//矩阵的大小
int T;
ll n,m;
ll add(ll a,ll b)
{
a%=mod;
b%=mod;
return (a+b)%mod;
}
struct hh
{
ll ma[N][N];
}a,res;
hh multi(hh a,hh b)
{
hh tmp;
memset(tmp.ma,,sizeof(tmp.ma));
for(int i=;i<N;i++)
for(int j=;j<N;j++)
for(int k=;k<N;k++)
{
tmp.ma[i][j]=add(tmp.ma[i][j],a.ma[i][k]*b.ma[k][j]);
}
return tmp;
}
void fast_pow(hh a,long long k)
{
memset(res.ma,,sizeof(res.ma));
for(int i=;i<N;i++)res.ma[i][i]=;
while(k>)
{
if(k&) res=multi(res,a);
a=multi(a,a);
k>>=;
}
}
int main()
{
while(~scanf("%lld%d",&n,&m))
{
for(int i=;i<=m;i++) a.ma[i][i-]=;
a.ma[][]=a.ma[][m]=;
fast_pow(a,n);
printf("%lld\n",res.ma[][]);
}
return ;
}
最新文章
- C++ 与 php 的交互 之----- C++ 异步获取 网页文字内容,异步获取 php 的 echo 值。
- java操作数据库增删改查的小工具1--TxQueryRunner
- 用Android Studio 出现的问题
- SQL*Loader之CASE1
- [LintCode] Intersection of Two Arrays II 两个数组相交之二
- JMeter学习-019-JMeter 监听器之【聚合报告】界面字段解析及计算方法概要说明
- tomcat 6.0.44 &ldquo;has failed to stop it. This is very likely to create a memory leak&rdquo; 问题调查
- Redis 3.0 集群搭建
- Mysql查询优化器
- SQL server2012连接不上
- sass中出现的中文问题
- (五)学习JavaScript之firstChild 属性
- [每日一题] 11gOCP 1z0-052 :2013-08-30 差异的增量备份.....................................................A1
- 使用 Eclipse Memory Analyzer 进行简单内存泄漏分析
- css实现一行居中显示,两行靠左显示,超过两行以引号省略
- Android 开发使用第三方库出现Crash时处理方案汇总
- 学习Tensorflow,反卷积
- ELK全Dokcer 部署
- maven wrapper使用本地maven
- elasticsearch best_fields most_fields cross_fields从内在实现看区别——本质就是前两者是以field为中心,后者是词条为中心