hdu 5564 Clarke and digits(矩阵快速幂)
2015-11-16 18:13
218 查看
题目链接:hdu 5564 Clarke and digits
解题思路
(i,j)表示该位为i并且取模7为j的种数。根据k构造一个70*70的矩阵代码
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 75; const int mod = 1e9 + 7; struct Mat { int r, c, s[maxn][maxn]; void init(int r, int c) { this->r = r; this->c = c; memset(s, 0, sizeof(s)); } }; Mat o, x, tmp; void presolve(int k) { o.init(71, 1); for (int i = 1; i < 10; i++) o.s[i * 7 + i % 7][0]++; x.init(71, 71); for (int i = 0; i < 10; i++) { for (int ki = 0; ki < 7; ki++) { int u = i * 7 + ki; for (int j = 0; j < 10; j++) if (i + j != k) { int v = j * 7 + (ki * 10 + j) % 7; x.s[v][u]++; } } } for (int i = 0; i <= 10; i++) x.s[70][i*7] = 1; } void mul(const Mat& a, const Mat& b, Mat& c) { tmp.init(a.r, b.c); for (int i = 0; i < tmp.r; i++) { for (int j = 0; j < tmp.c; j++) for (int k = 0; k < a.c; k++) tmp.s[i][j] = (tmp.s[i][j] + 1LL * a.s[i][k] * b.s[k][j] % mod) % mod; } c = tmp; } int pow_mod(Mat ret, Mat x, int n) { while (n) { if (n&1) mul(x, ret, ret); mul(x, x, x); n >>= 1; } return ret.s[70][0]; } int main () { int cas, l, r, k; scanf("%d", &cas); while (cas--) { scanf("%d%d%d", &l, &r, &k); presolve(k); int ans = (pow_mod(o, x, r) - pow_mod(o, x, l-1) + mod) % mod; printf("%d\n", ans); } return 0; }
相关文章推荐
- 缓存使用中Redis,Memcached的共性和差异分析
- php版 - 每个程序员1小时内必须解决的5个编程问题
- [转]动态加载JS脚本
- scanf()函数在VS2013上运行报错的解决办法
- scanf()函数在VS2013上运行报错的解决办法
- scanf()函数在VS2013上运行报错的解决办法
- scanf()函数在VS2013上运行报错的解决办法
- scanf()函数在VS2013上运行报错的解决办法
- Eclipse使用学习指南
- 在 Ubuntu 系统中部署 Git Server
- 前端js 模块封装
- 模型
- IIS Express支持json
- 40个迹象表明你还是PHP菜鸟
- 用机器学习识别随机生成的C&C域名
- linux服务器(二)之linux服务器配置文件详解
- FOJ有奖月赛-2015年11月 Problem A 据说题目很水
- PHP小菜鸟成长历程之wamp的伪静态和虚拟主机配置
- 酷狗百花自媒体平台开始运营内测
- LeetCode---Subsets II