http://codeforces.com/gym/101161/attachments

这题通过打表,可以知道长度是i的时候的合法方案数。

然后得到f[1] = 2, f[2] = 3, f[3] = 5, f[4] = 8......这样的广义fib数列

现在要求f[k] + f[2k] + f[3k] + ...... + f[xk]的总和。

直接做很难做,我不知道f[i * k] = x * f[(i - 1) * k] + y * f[(i - 2) * k]

推不出系数的话,有一个结论就是:fib的任意一项肯定能表示成x * f(i - 1) + y * f(i - 2),就是两个连续的fib数字,能表示出后面所有的fib数列。知道这样的东西后。

可以知道,比如k = 2

形如f(6) = 2 * f(4) + f(3)、然后f(8) = 2 * f(6) + f(5)

那么就可以构造矩阵了。

sum, f(4),f(3)   ----->   newSum, f(6), f(5)

同样用f(4)和f(3)把f(5)表示出来即可(注意:肯定能表示)

一般构造了矩阵后,写一个求第k项的函数出来,往往比较有用

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#define X first
#define Y second
#define lson T[rt].l
#define rson T[rt].r
#define clr(u,v); memset(u,v,sizeof(u));
#define in() freopen("data.txt","r",stdin);
#define out() freopen("ans","w",stdout);
#define Clear(Q); while (!Q.empty()) Q.pop();
#define pb push_back using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int maxn = ;
const int MOD = 1e9 + ;
struct Matrix {
LL a[maxn][maxn];
int row, col;
} base, a;
struct Matrix mul(struct Matrix a, struct Matrix b, int MOD) {
struct Matrix c = {};
c.row = a.row, c.col = b.col;
for (int i = ; i <= a.row; ++i) {
for (int j = ; j <= b.col; j++) {
for (int k = ; k <= b.row; ++k) {
c.a[i][j] += a.a[i][k] * b.a[k][j];
c.a[i][j] %= MOD;
}
}
}
return c;
}
struct Matrix qp(Matrix ans, Matrix base, LL n, LL MOD) {
while (n) {
if (n & ) {
ans = mul(ans, base, MOD);
}
n >>= ;
base = mul(base, base, MOD);
}
return ans;
}
int f;
void initBaseFib() {
base.row = base.col = ;
base.a[][] = , base.a[][] = ;
base.a[][] = , base.a[][] = ;
}
LL findK(int a, int b, LL k) {
if (k == ) return a;
if (k == ) return b;
initBaseFib();
Matrix t;
t.row = , t.col = ;
t.a[][] = b, t.a[][] = a;
t = qp(t, base, k - , MOD);
return t.a[][];
}
void initBaseSum(int a, int b, int c, int d) {
base.row = base.col = ;
base.a[][] = , base.a[][] = , base.a[][] = ;
base.a[][] = , base.a[][] = a, base.a[][] = b;
base.a[][] = , base.a[][] = c, base.a[][] = d;
}
int pre[];
int sum[];
LL getpos(LL n, LL k) {
if (n == ) return ;
if (n == ) return findK(, , n * k);
if (k == ) {
initBaseSum(, , , );
Matrix t;
t.row = , t.col = ;
t.a[][] = , t.a[][] = , t.a[][] = ;
t = qp(t, base, n - , MOD);
return t.a[][];
} else if (k == ) {
initBaseSum(, , , );
Matrix t;
t.row = , t.col = ;
t.a[][] = , t.a[][] = , t.a[][] = ;
t = qp(t, base, n - , MOD);
return t.a[][];
} else {
Matrix t;
t.row = , t.col = ;
t.a[][] = findK(, , k), t.a[][] = findK(, , * k), t.a[][] = findK(, , * k - );
initBaseSum(findK(,,k-), findK(,,k-), findK(,,k-), findK(,,k-));
t = qp(t, base, n - , MOD);
return t.a[][];
}
}
void work() {
LL be, en, k;
cin >> be >> en >> k;
if (k == ) {
//sumofall fib
if (en <= ) {
printf("Case %d: %d\n", ++f, sum[en] - sum[be - ]);
return;
} initBaseSum(, , , );
be--;
a.row = , a.col = ;
a.a[][] = , a.a[][] = , a.a[][] = ;
Matrix ret = qp(a, base, en - , MOD);
LL resEn = ret.a[][];
LL resBe = ;
if (be - >= ) {
ret = qp(a, base, be - , MOD);
resBe = ret.a[][];
}
printf("Case %d: %d\n", ++f, (resEn - resBe + MOD) % MOD);
return;
} else {
en = en / k;
if (be % k == ) be = (be - k) / k;
else be /= k;
// cout << be << " " << en << endl;
LL ans = (getpos(en, k) - getpos(be, k) + MOD) % MOD;
printf("Case %d: %d\n", ++f, ans);
}
}
int cnt[];
void dfs(int k, int t1, int t2) {
if (k == t1 || k == t2) {
cnt[k]++;
return;
}
dfs(k - , t1, t2);
dfs(k - , t1, t2);
}
int main() {
#ifdef local
in();
#else
#endif
pre[] = , pre[] = , pre[] = , pre[] = ;
sum[] = , sum[] = , sum[] = , sum[] = ;
// int one = 6, t1 = 4, t2 = 2;
// dfs(one, t1, t2);
// cout << cnt[t1] << " " << cnt[t2] << endl;
int t;
scanf("%d", &t);
while (t--) work();
return ;
}

Binary Strings Gym - 101161G 矩阵快速幂 + 打表的更多相关文章

  1. Nowcoder 练习赛 17 C 操作数 ( k次前缀和、矩阵快速幂打表找规律、组合数 )

    题目链接 题意 :  给定长度为n的数组a,定义一次操作为: 1. 算出长度为n的数组s,使得si= (a[1] + a[2] + ... + a[i]) mod 1,000,000,007: 2. ...

  2. Gym 100952H&&2015 HIAST Collegiate Programming Contest H. Special Palindrome【dp预处理+矩阵快速幂/打表解法】

    H. Special Palindrome time limit per test:1 second memory limit per test:64 megabytes input:standard ...

  3. Nowcoder 北师校赛 B 外挂使用拒绝 ( k次前缀和、矩阵快速幂打表找规律、组合数 )

    题目链接 题意 : 中文题.点链接 分析 : 有道题是问你不断求前缀和后的结果 Click here 这道题问的是逆过程 分析方法雷同.可参考 Click here ----------------- ...

  4. LightOJ 1268 Unlucky Strings (KMP+矩阵快速幂)

    题意:给出一个字符集和一个字符串和正整数n,问由给定字符集组成的所有长度为n的串中不以给定字符串为连续子串的有多少个? 析:n 实在是太大了,如果小的话,就可以用动态规划做了,所以只能用矩阵快速幂来做 ...

  5. bnuoj 34985 Elegant String DP+矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...

  6. (hdu 6030) Happy Necklace 找规律+矩阵快速幂

    题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=6030 Problem Description Little Q wants to buy a nec ...

  7. HDU6030 Happy Necklace(递推+矩阵快速幂)

    传送门:点我 Little Q wants to buy a necklace for his girlfriend. Necklaces are single strings composed of ...

  8. Codeforces 691E Xor-sequences(矩阵快速幂)

    You are given n integers a1,  a2,  ...,  an. A sequence of integers x1,  x2,  ...,  xk is called a & ...

  9. CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂

    772002画马尾 题目连接: http://acm.uestc.edu.cn/#/problem/show/1280 Description 众所周知772002很喜欢马尾,所以他决定画几幅马尾送给 ...

随机推荐

  1. 在Global Azure上用Azure CLI创建ARM的VM和面向公网的负载均衡

    在Global的Azure上,新的Portal和ARM已经正式发布.将来传统的portal和ASM将逐渐淡出. China Azure将在今年下半年推出新的Portal管理界面和ARM功能(即IaaS ...

  2. 字符编码ANSI、ASCII、GB2312、GBK、GB18030、UNICODE、UTF-8小结

    编码和解码可以理解成二进制和字符(广义的字符,包括汉字等)的映射表,编码即从字符映射至二进制,解码则为逆过程. 1.英语字符编码ASCII 开始计算机只在美国用.8字节一共可以组合出256(2的8次方 ...

  3. HTTP ERROR

    HTTP 400 – 请求无效HTTP 401.1 – 未授权:登录失败HTTP 401.2 – 未授权:服务器配置问题导致登录失败HTTP 401.3 – ACL 禁止访问资源HTTP 401.4 ...

  4. [51nod1106]质数检测

    解题关键: 根据质数的定义,在判断一个数n是否是质数时,我们只要用1至n-1去除n,看看能否整除即可.但我们有更好的办法.先找一个数m,使m的平方大于n,再用<=m的质数去除n(n即为被除数), ...

  5. 微信小程序报错.wxss无法找到

    小程序原来一直运行正常,编译都没有问题,但今天更新了一下工具,就一直编译不过,报.wxss无法找到,搜索半天,才解决. 解决方案如下: 在控制台输入openVendor(), 在打开的目录中清除wcs ...

  6. Hive 查询优化总结

    一.join优化 Join查找操作的基本原则:应该将条目少的表/子查询放在 Join 操作符的左边.原因是在 Join 操作的 Reduce 阶段,位于 Join 操作符左边的表的内容会被加载进内存, ...

  7. 红米用adb连接显示unauthorized的解决办法

    网上能搜到的各种办法都试过了, 没一个可行: 1.大部份是用来解决usb不识别的,也就是adb devices不显示.但现在是有显示,只是unauthorized 2.我习惯用tcp连接,少根线,多台 ...

  8. java类什么时候初始化?

    Java虚拟机规范中并没有进行强制玉树什么情况下需要开始类加载过程.但是对于初始化阶段,虚拟机规范则是严格规定了有且仅有5种情况必须立即对类进行“初始化”(而加载,验证,准备自然需要在此之前开始): ...

  9. LeetCode第20题:有效的括号

    问题描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空 ...

  10. 数学建模美赛O奖论文总结

    Anil S. Damle Colin G. West Eric J. Benzel University of Colorado–Boulder Boulder, CO Advisor: Anne ...