hdu 5564 Clarke and digits
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=5564
-----------------------------------------------------------------------------------------
刚读完题目感觉像是数位DP,然而仔细看了数据范围后感觉很不可做。
与数位DP题目对比可以发现 此题数据范围要大一些,却没有对每一位进行限制
于是便可以愉快地进行矩阵乘法优化DP啦
如果矩阵构造(将递推式转换为矩阵形式)还不熟练的话 可以参考
挑战程序设计竞赛(第2版) 3.4.2节
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int mod = 1e9 + , L = + ;
int t, l, r, m;
long long raw[L][L], tmp[L][L], a[L][L], b[L][L], f[L];
long long ans1, ans2;
void mul(long long A[L][L], long long B[L][L])
{
memset(tmp, , sizeof tmp);
for(int i = ; i < L; ++i)
for(int j = ; j < L; ++j)
{
for(int k = ; k < L; ++k)
tmp[i][j] += A[i][k] * B[k][j] % mod;
tmp[i][j] %= mod;
}
for(int i = ; i < L; ++i)
for(int j = ; j < L; ++j)
A[i][j] = tmp[i][j];
}
long long solve(int lim)
{
if(!lim)
return ;
if(lim == )
return ;
lim -= ;
for(int i = ; i < L; ++i)
for(int j = ; j < L; ++j)
a[i][j] = b[i][j] = raw[i][j];
while(lim)
{
if(lim & )
mul(a, b);
mul(b, b);
lim >>= ;
}
long long tans = ;
for(int i = ; i < L; ++i)
tans += a[][i] * f[i] % mod;
return tans % mod;
}
int main()
{
for(int i = ; i <= ; ++i)
f[i * + i % ] = ;
f[] = ;
scanf("%d", &t);
while(t--)
{
scanf("%d%d%d", &l, &r, &m);
memset(raw, , sizeof raw);
for(int i = ; i <= ; ++i)
for(int j = ; j <= ; ++j)
if(i + j != m)
{
for(int k = ; k < ; ++k)
{
raw[i * + (k * + i) % ][j * + k] = ;
if((k * + i) % == )
++raw[][j * + k];
}
}
raw[][] = ;
ans1 = solve(l - );
ans2 = solve(r);
printf("%lld\n", (ans2 - ans1 + mod) % mod);
}
return ;
}
hdu 5564 Clarke and digits的更多相关文章
- hdu 5564 Clarke and digits 矩阵快速幂优化数位dp
		
Clarke and digits Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
 - HDU 5564 Clarke and digits 状压dp+矩阵加速
		
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5564 题意: 求长度在[L,R]范围,并且能整除7的整数的总数. 题解: 考虑最原始的想法: dp[ ...
 - 【HDOJ】5564 Clarke and digits
		
DP+快速矩阵幂.注意base矩阵的初始化,不难. /* 5564 */ #include <iostream> #include <string> #include < ...
 - HDU 5564:Clarke and digits 收获颇多的矩阵快速幂 + 前缀和
		
Clarke and digits Accepts: 16 Submissions: 29 Time Limit: 5000/3000 MS (Java/Others) Memory Limi ...
 - HDU 5628 Clarke and math——卷积,dp,组合
		
HDU 5628 Clarke and math 本文属于一个总结了一堆做法的玩意...... 题目 简单的一个式子:给定$n,k,f(i)$,求 然后数据范围不重要,重要的是如何优化这个做法. 这个 ...
 - hdu 5565 Clarke and baton 二分
		
Clarke and baton Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
 - hdu 5563 Clarke and five-pointed star 水题
		
Clarke and five-pointed star Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/show ...
 - hdu 5465 Clarke and puzzle 二维线段树
		
Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
 - hdu 5464 Clarke and problem dp
		
Clarke and problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php ...
 
随机推荐
- Python几行代码实现邮件发送
			
话不多说直接进入正题 首先我们需要安装一个名为'zmail'的包,终端执行'pip install zmail'即可实现安装. 直接上代码 import zmail mail = { 'subject ...
 - EasyUI的datagrid列属性添加超链接
			
$("#dg").datagrid({ url: "../Ajax/PurchaseAjax.ashx", queryParams: ...
 - hive 取排行第二的工资
			
CREATE TABLE employee( id INT , salary INT ); INSERT INTO employee , UNION ALL , UNION ALL ,; SELECT ...
 - Java并发编程:线程的同步
			
Java并发编程:线程的同步 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} J ...
 - Linux文件目录可视化远程软件winscp的使用
			
这个软件不是必须的,一般有命令行就可以操作文件目录,但winscp有图形界面,双击文件就可以编辑和保存,使用方式更接近windows Winscp是开源软件,安装包可以自行下载获取找有关人士获取 要新 ...
 - JS方法使用中文出参数 ,报错异常
			
正常这样加载数字没问题,但是当参数是中文时就会报错 <li onclick='onSeach(‘’" + name+ "');'>" + name+ &quo ...
 - 解决嵌套在ScrollView中的TableView滑动手势冲突问题
			
最近在迭代开发公司项目的时候遇到了一个问题,在可以左右切换标签视图的ScrollView中嵌套了两个TableView用于展示视图,感觉一切so easy的情况下,问题出现了,因为左右两个视图既可以实 ...
 - Kvm04  kvm虚拟机热迁移,可视化管理
			
目录 1.kvm虚拟机热迁移 1). 冷迁移 修改配置文件,将定义的格式raw,改成qcow2格式! 修改完成,重启服务 2).热迁移 2.Virt-manager管理Kvm虚拟机 1.kvm虚拟机热 ...
 - Cent OS 7  VNC 安装
			
关闭防火墙 关闭selinux 挂载光盘到本地 #yum install tigervnc-server -y #cp /lib/systemd/system/vncserver@.service / ...
 - robotframework的if else