# 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(1T5), the number of the test cases.
Each test case contains three integers l,r,k(1lr109,0k18).

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, 用矩阵快速幂来加速运算, 第一次做矩阵快速幂的题目, 参考了题

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;
}

#### BestCoder Round #62 (div.2)-Clarke and baton（二分搜索）

2015-11-15 00:38:01

#### BestCoder Round #62 (div.2)-Clarke and food（模拟）

2015-11-14 21:46:05

#### BestCoder Round #62 (div.2) Clarke and food

2015-11-15 17:47:43

#### BestCoder Round #62 (div.2) 1001 Clarke and food

2015-11-14 23:18:52

#### BestCoder Round #62 (div.2) Clarke and five-pointed star

2015-11-15 18:16:18

#### 【HDU5628】Clarke and math-狄利克雷卷积+快速幂

2017-06-17 21:07:51

#### [BestCoder Round #88]Tree Cutting

2016-10-02 22:16:06

#### BestCoder Round #82 (div.1) 1002 HDU 5677 dp-类似多重背包的思想

2016-05-08 22:38:49

#### Codeforces Round #423(Div.2)

2017-07-12 03:48:20

#### hdu 5563 Clarke and five-pointed star 【BestCoder Round #62 (div.2) 1002】

2015-11-15 13:54:19

## 不良信息举报

BestCoder Round #62 (div.2) HDOJ5564 Clarke and digits(dp + 快速幂)