#1560 : H国的身份证号码II(dp+矩阵快速幂)
#1560 : H国的身份证号码II
描述
H国的身份证号码是一个N位的正整数(首位不能是0)。此外,由于防伪需要,一个N位正整数是合法的身份证号码当且仅当每位数字都小于等于K,并且任意相邻两位数字的乘积也小于等于K。
例如对于K=5, 101、211、210等都是合法的号码,而106、123、421等都是非法的号码。
给定一个正整数N以及K,H国总统想知道一共有多少个合法的号码可用。
输入
两个整数N和K。
对于30%的数据,1 ≤ N ≤ 10
对于50%的数据,1 ≤ N ≤ 1000000
对于100%的数据,1 ≤ N ≤ 1012,1 ≤ K ≤ 81。
输出
合法号码的总数。由于答案可能非常大,你只需要输出答案对109+7取模的结果。
样例输入
2 4
样例输出
12
//dp[i][j] 代表 i 长度,结尾为 j 的合法方案数
那么容易想到
i = 1 : dp[1][j] = 1 (j<=k)
i > 1 : dp[i][j] = ∑dp[i-1][x] (x<=k&&j<=k&&j*x<=k)
# include <cstdio>
# include <cstring>
# include <cstdlib>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <bitset>
# include <sstream>
# include <set>
# include <cmath>
# include <algorithm>
# pragma comment(linker,"/STACK:102400000,102400000")
using namespace std;
# define LL long long
# define pr pair
# define mkp make_pair
# define lowbit(x) ((x)&(-x))
# define PI acos(-1.0)
# define INF 0x3f3f3f3f3f3f3f3f
# define eps 1e-
# define MOD inline int scan() {
int x=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
}
inline void Out(int a) {
if(a<) {putchar('-'); a=-a;}
if(a>=) Out(a/);
putchar(a%+'');
}
#define MX 10
/**************************/
struct Mat
{
LL m[MX][MX];
}unit,di,fir; LL n,k; Mat mult(Mat a,Mat b)
{
Mat c;
for (int i=;i<MX;i++)
for (int j=;j<MX;j++)
{
c.m[i][j]=;
for (int k=;k<MX;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%MOD;
}
return c;
} Mat cal(LL p)
{
Mat ret = unit, b = di;
while (p)
{
if (p&) ret = mult(ret,b);
b = mult(b,b);
p/=;
}
return ret;
} void Init()
{
for (int i=;i<MX;i++)
unit.m[i][i]=;
for (int i=;i<MX;i++)
{
if (i<=k)
fir.m[i][]=;
}
for (int i=;i<MX;i++)
{
for (int j=;j<MX;j++)
{
if (i<=k&&j<=k&&i*j<=k)
di.m[i][j]=di.m[j][i]=;
}
}
} int main()
{
scanf("%lld%lld",&n,&k);
Init();
Mat sa = fir;
Mat sb = cal(n-);
sb = mult(sb,sa); LL ans = ;
for (int i=;i<MX;i++)
{
ans = (ans + sb.m[i][])%MOD;
}
printf("%lld\n",ans);
return ;
}
#1560 : H国的身份证号码II(dp+矩阵快速幂)的更多相关文章
- H国的身份证号码(搜索)
个人心得:巧妙利用数字进行维护就好了,深搜还是有点心得的: #1558 : H国的身份证号码I 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H国的身份证号码是一个N位 ...
- hihoCoder #1558 : H国的身份证号码I
题目链接:https://hihocoder.com/problemset/problem/1558 H国的身份证号码I 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 ...
- BZOJ5298 CQOI2018 交错序列 【DP+矩阵快速幂优化】*
BZOJ5298 CQOI2018 交错序列 [DP+矩阵快速幂优化] Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻 ...
- bnuoj 34985 Elegant String DP+矩阵快速幂
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...
- HDU 5434 Peace small elephant 状压dp+矩阵快速幂
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant Accepts: 38 Submissions: ...
- 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂
[题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】
题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...
- codeforces E. Okabe and El Psy Kongroo(dp+矩阵快速幂)
题目链接:http://codeforces.com/contest/821/problem/E 题意:我们现在位于(0,0)处,目标是走到(K,0)处.每一次我们都可以从(x,y)走到(x+1,y- ...
随机推荐
- bzoj1710【Usaco2007 Open】Cheappal 便宜回文
1710: [Usaco2007 Open]Cheappal 便宜回文 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 466 Solved: 262 ...
- 通过ngxtop实时监控webserver的访问情况 / 解决ImportError: No module named _sqlite3问题
通过ngxtop实时监控webserver的访问情况 2014-04-03 0个评论 来源:通过ngxtop实时监控web server的访问情况 收藏 我要投稿 关于对ng ...
- python(30)- 常用模块
模块就是py文件.python中能开辟作用域的只有函数.类和模块. for循环不能开辟作用域,for循环内的变量为全局变量.if...else...同for循环一样. 一 time模块 时间表示形式 ...
- nginx 根据域名反向代理
#nginx 反向代理域名,会根据启动时候解析出来的ip,加载到内存中,后面不会改变可以绑定hosts或者指定resolve服务器来固定ip #注意proxy最后的斜杠,如果不加会将请求过来的目录带到 ...
- Java synchronized详解(java 线程同步)
http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html
- error C2998: 'XXXXXXX' : cannot be a template definition 的可能原因。
从错误信息的字面意思可以看出来是 XXXXX 不能作为模板定义. 但是为什么不能,并没有说明,最后我翻阅各种资料,各种尝试后,发现往往可能是由于找不到模板函数的某个参数的定义而导致的. templat ...
- cf #363 d
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output stan ...
- spring reactor记录操作日志
1.注册日志的类: @Configuration@EnableReactorpublic class ReactorConfig { /** * * 〈注册审计日志 Reactor〉 */ @Bean ...
- jcosole使用方法
一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JCo ...
- ubi实际使用
ubifs号称性能比yaffs2 好,同时压缩可读写,文件系统image体较小同时可写.1. uboot使能对UBIFS的支持#define CONFIG_CMD_NAND#define CONFIG ...