BestCoder Round #62 (div.2) HDOJ5564 Clarke and digits(dp + 快速幂)
来源:互联网 发布:语c软件 编辑:程序博客网 时间:2024/06/06 03:15
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 .
He wants to know the number of positive integers which have a length in
Input
The first line contains an integer T(1≤T≤5) , the number of the test cases.
Each test case contains three integersl,r,k(1≤l≤r≤109,0≤k≤18) .
Each test case contains three integers
Output
Each test case print a line with a number, the answer modulo 109+7 .
Sample Input
21 2 52 3 5
Sample Output
13125Hint: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;}
0 0
- BestCoder Round #62 (div.2) HDOJ5564 Clarke and digits(dp + 快速幂)
- 【HDU5564 BestCoder Round 62 (div1)B】【DP转矩阵快速幂】Clarke and digits 长度在[l,r]范围内7倍数数个数要求相邻两位不为K
- BestCoder Round #62 (div.2)-Clarke and food(模拟)
- BestCoder Round #62 (div.2) 1001 Clarke and food
- BestCoder Round #62 (div.2) HDU 5562 Clarke and food
- BestCoder Round #62 (div.2) Clarke and food
- BestCoder Round #62 (div.2) Clarke and five-pointed star
- BestCoder Round #62 (div.2) D.Clarke and baton
- BestCoder Round #62 (div.2) HDOJ5562 Clarke and food(脑洞)
- hdu5463 Clarke and minecraft(BestCoder Round #56 (div.2) )
- BestCoder Round #56 (div.2)(Clarke and minecraft)
- BestCoder Round #56 (div.2)(Clarke and problem)
- BestCoder Round #56 (div.2) HDU5463 Clarke and minecraft
- hdu 5464 Clarke and problem (BestCoder Round #56 (div.2))
- BestCoder Round #56 (div.2) HDU5463 Clarke and minecraft
- BestCoder Round #72 (div.2) A.Clarke and chemistry
- BestCoder Round #72 (div.2) B.Clarke and points
- BestCoder Round #72 (div.2) Clarke and math
- Java的重写与调用父类方法问题
- 逻辑电路 - 继电器Relay
- 收藏图片,将图片保存到iphone本地图库中
- 【HDU5565 BestCoder Round 62 (div1)C】【STL or 二分答案 or 计数排序】Clarke and baton n个人减肥m次求最后异或值
- Ubuntu apt-get 版本依赖的问题
- BestCoder Round #62 (div.2) HDOJ5564 Clarke and digits(dp + 快速幂)
- 自定义圆形和圆角图片
- 师兄的vim配置(据说公司的人都用这个)
- linux下查看所有用户及所有用户组
- Ubuntu 12.04 KVM之VM动态迁移—iscsi存储
- 在Bundle中传递自定义的Arraylist<Object>
- CTreeCtrl的用法
- 内核线程、轻量级进程、用户线程 http://blog.csdn.net/hsly_support/article/details/7397103
- Android Diaolog与AlertDialog用法实例