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

原创 2015年11月18日 10:55:40

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

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

【HDU5564 BestCoder Round 62 (div1)B】【DP转矩阵快速幂】Clarke and digits 长度在[l,r]范围内7倍数数个数要求相邻两位不为K

#include #include #include #include #include #include #include #include #include #include #include #...
  • snowy_smile
  • snowy_smile
  • 2015年11月18日 17:08
  • 1275

Leetcode 372. Super Pow 快速幂计算 解题报告

1 解题思想这道题需要计算 a^b % c 的值,其中b非常的大,大到只能使用数组来表示。这道题是ACM里面常见的快速幂的解题方式,这其中有一个数学的推论,可以看我代码里附带的那个解释。 总之,这...
  • MebiuW
  • MebiuW
  • 2016年07月07日 19:20
  • 6421

算法学习 - 快速幂和矩阵快速幂(复杂度Olog(n))C++实现

快速幂 快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。 快速幂实现原理 快速幂的原理比较好懂,就是说假如我们...
  • chenfs1992
  • chenfs1992
  • 2014年12月24日 22:51
  • 7712

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

Clarke and baton    Accepts: 1    Submissions: 126  Time Limit: 12000/6000 MS (Java/Others)    Memo...
  • zsc2014030403015
  • zsc2014030403015
  • 2015年11月15日 00:38
  • 288

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

Clarke and five-pointed star    Accepts: 237    Submissions: 591  Time Limit: 2000/1000 MS (Java/Ot...
  • zsc2014030403015
  • zsc2014030403015
  • 2015年11月14日 21:54
  • 287

HDU 5562 Clarke and food(排序)——BestCoder Round #62(div.2)

HDU 5562 Clarke and food(排序)——BestCoder Round #62(div.2)
  • queuelovestack
  • queuelovestack
  • 2015年11月14日 22:40
  • 430

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

Clarke and five-pointed star                                           Time Limit: 2000/1000 MS (Ja...
  • qq1319479809
  • qq1319479809
  • 2015年11月14日 23:37
  • 228

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

Clarke and food    Accepts: 353    Submissions: 962  Time Limit: 2000/1000 MS (Java/Others)    Memo...
  • zsc2014030403015
  • zsc2014030403015
  • 2015年11月14日 21:46
  • 270

HDU 5563 Clarke and five-pointed star(判断正五边形)——BestCoder Round #62(div.1 div.2)

HDU 5563 Clarke and five-pointed star(判断正五边形)——BestCoder Round #62(div.1 div.2)
  • queuelovestack
  • queuelovestack
  • 2015年11月14日 22:57
  • 697

HDU 5564:Clarke and digits 收获颇多的矩阵快速幂 + 前缀和

Clarke and digits    Accepts: 16    Submissions: 29  Time Limit: 5000/3000 MS (Java/Others)    Memo...
  • u010885899
  • u010885899
  • 2015年11月19日 23:40
  • 596
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BestCoder Round #62 (div.2) HDOJ5564 Clarke and digits(dp + 快速幂)
举报原因:
原因补充:

(最多只允许输入30个字)