BestCoder Round #62 (div.2) HDOJ5564 Clarke and digits(dp + 快速幂)
2015-11-18 10:55
393 查看
Clarke and digits
Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 88 Accepted Submission(s): 44
Problem Description
Clarke is a patient with multiple personality disorder. One day, Clarke turned into a researcher, did a research on digits.
He wants to know the number of positive integers which have a length in [l,r] and
are divisible by 7 and
the sum of any adjacent digits can not be k.
Input
The first line contains an integer T(1≤T≤5),
the number of the test cases.
Each test case contains three integers l,r,k(1≤l≤r≤109,0≤k≤18).
Output
Each test case print a line with a number, the answer modulo 109+7.
Sample Input
2
1 2 5
2 3 5
Sample Output
13
125
Hint:
At the first sample there are 13 number $7,21,28,35,42,49,56,63,70,77,84,91,98$ satisfied.
题目链接:点击打开链接
dp[i][j]表示长度为i取模为7的种类数, 参考数据范围, 直接计算会TLE, 用矩阵快速幂来加速运算, 第一次做矩阵快速幂的题目, 参考了题
解, 1LL防止数据溢出出错, 转态转移方程: z.dp[i][j] = (z.dp[i][j] + 1LL * a.dp[i][k] * b.dp[k][j] % MOD) % MOD
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "cmath"
#include "utility"
#include "map"
#include "set"
#include "vector"
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
const int MAXN = 100;
struct Matrix
{
/* data */
int row, col, dp[MAXN][MAXN];
void init(int r, int c) {
row = r;
col = c;
memset(dp, 0, sizeof(dp));
}
}x, y, z;
int l, r, k;
void magic(int k)
{
for(int i = 1; i < 10; ++i)
x.dp[i * 7 + i % 7][0]++;
for(int i = 0; i < 10; ++i)
for(int j = 0; j < 7; ++j) {
int u = i * 7 + j;
for(int m = 0; m < 10; ++m)
if(i + m != k) {
int v = m * 7 + (j * 10 + m) % 7;
y.dp[v][u]++;
}
}
for(int i = 0; i <= 10; ++i)
y.dp[70][i * 7] = 1;
}
void mul(const Matrix &a, const Matrix &b, Matrix &c)
{
z.init(a.row, b.col);
for(int i = 0; i < z.row; ++i)
for(int j = 0; j < z.col; ++j)
for(int k = 0; k < a.col; ++k)
z.dp[i][j] = (z.dp[i][j] + 1LL * a.dp[i][k] * b.dp[k][j] % MOD) % MOD;
c = z;
}
int power_mod(Matrix a, Matrix b, int n)
{
while(n > 0) {
if(n & 1) mul(b, a, a);
mul(b, b, b);
n >>= 1;
}
return a.dp[70][0];
}
int main(int argc, char const *argv[])
{
int t;
scanf("%d", &t);
while(t--) {
x.init(MAXN, 1);
y.init(MAXN, MAXN);
scanf("%d%d%d",&l, &r, &k);
magic(k);
int ans = (power_mod(x, y, r) - power_mod(x, y, l - 1) + MOD) % MOD;
printf("%d\n", ans);
}
return 0;
}
相关文章推荐
- Android 操作系统获取Root权限 原理详细解析
- List分组
- Spring JdbcTemplate方法详解
- 集体智慧总结和使用范围归纳(四)
- Windows App 发送邮件
- txt文件下载
- android service常驻内存的一点思考
- NYOJ 2 括号配对问题 模拟栈
- RotatedRect类(旋转矩形)
- 3.Thread中的静态方法
- FusionCharts属性
- 获取手机内部所有应用的方法比较 PackageInfo、ResolveInfo
- Spring MVC 中 HandlerInterceptorAdapter的使用
- 游戏中的任务系统的简单架构!
- 线程调度 http://blog.csdn.net/loyal_baby/article/details/4202083
- android View 总结
- Android Service 双进程常驻后台(2)
- HMM算法
- struts2单文件,多文件上传
- 菜鸟谈谈二维数组