codeforces gym #101161G - Binary Strings(矩阵快速幂)

题目链接:

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

题意:

数据范围:

分析:

ac代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
const int maxn = 1e5+100;
const int mod=1e9+7;
struct Node{
    ll num[4][4];
    Node(){memset(num,0,sizeof(num));}
}dd,ss,tt,gg,zz;
ll dpk,dpk1;
Node mul(Node a,Node b){
    Node res;
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            for(int k=1;k<=3;k++)
                res.num[i][j]=(res.num[i][j]+a.num[i][k]*b.num[k][j]%mod)%mod;
    return res;
}
Node qpow(Node x,ll n){
    Node res=dd;
    while(n>0){
        if(n&1)
            res=mul(res,x);
        x=mul(x,x);
        n/=2;
    }
    return res;
}
ll cal(ll x){
    if(x==0)return 0;
    Node res=qpow(gg,x-1);
    return (dpk*res.num[3][1]%mod+dpk1*res.num[3][2]%mod+dpk*res.num[3][3]%mod)%mod;
}
int main()
{
    dd.num[1][1]=dd.num[2][2]=dd.num[3][3]=1;
    ss.num[1][1]=ss.num[1][2]=ss.num[2][1]=ss.num[3][1]
    =ss.num[3][2]=ss.num[3][3]=1;
    tt.num[1][1]=tt.num[1][2]=tt.num[2][1]=tt.num[3][3]=1;
    int T;
    scanf("%d",&T);
    for(int cn=1;cn<=T;cn++){
        ll L,R,k;
        scanf("%lld %lld %lld",&L,&R,&k);
        Node zz=qpow(ss,k-2);
        dpk=(zz.num[1][1]*3+zz.num[1][2]*2+zz.num[1][3]*5)%mod;
        dpk1=(zz.num[2][1]*3+zz.num[2][2]*2+zz.num[2][3]*5)%mod;
        if(k==1)dpk=2,dpk1=1;
        gg=mul(ss,qpow(tt,k-1));
        printf("Case %d: %lld\n",cn,(cal(R/k)-cal((L-1)/k)+mod)%mod);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/carcar/p/11493374.html

时间: 2024-08-25 21:44:57

codeforces gym #101161G - Binary Strings(矩阵快速幂)的相关文章

Light OJ 1268 Unlucky Strings 矩阵快速幂+KMP

题目来源:Light OJ 1268 Unlucky Strings 题意:给你一些可以用的字符 然后求组成不包含给定字符串的方案数 思路:矩阵经典问题 从i走k步路到达j的方案数 可以用矩阵快速幂求解 对于求长度为n的字符的方案数 就是走n步路 求走法 可以用KMP求出走一步 从前i个字符到前j个字符的方案数 这点有点不好理解 想一想 #include <cstdio> #include <cstring> #include <algorithm> #include

codeforces 678D Iterated Linear Function 矩阵快速幂

矩阵快速幂的题要多做 由题可得 g[n]=A*g[n-1]+B 所以构造矩阵  { g[n] }    =  {A   B}  * { g[n-1]} {   1   }         {0   1}     {    1    } 然后矩阵快速幂就好 矩阵快速幂的题要多做,多构造矩阵 注:其实这个题可以直接等比数列求求和,单数矩阵快速幂对于这类题更具有普遍性 #include <cstdio> #include <iostream> #include <ctime>

Codeforces 450B - Jzzhu and Sequences ( 矩阵快速幂 )

题意: 给定f1和f2,求fn 分析: 特判f1,f2 当n>=3时使用矩阵快速幂即可( 简单题 ) 将公式转化一下 , 可以得到一个变换矩阵 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MAT_SIZE 2 #define MOD 10

Codeforces 551D GukiZ and Binary Operations(矩阵快速幂)

Problem E. GukiZ and GukiZiana Solution 一位一位考虑,就是求一个二进制序列有连续的1的种类数和没有连续的1的种类数. 没有连续的1的二进制序列的数目满足f[i]=f[i-1]+f[i-2],恰好是斐波那契数列. 数据范围在10^18,用矩阵加速计算,有连续的1的数目就用2^n-f[n+1] 最后枚举k的每一位,是1乘上2^n-f[n+1],是0乘上f[n+1] 注意以上需要满足 2^l>k.并且这里l的最大值为64,需要特判. #include <bit

【矩阵快速幂 】Codeforces 450B - Jzzhu and Sequences (公式转化)

[题目链接]click here~~ [题目大意] Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, please calculate fn modulo1000000007(109?+?7). [解题思路] /*A - Jzzhu and Sequences Codeforces 450B - Jzzhu and Sequences ( 矩阵快速幂 )

Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences (矩阵快速幂)

题目链接:http://codeforces.com/problemset/problem/450/B 题意很好懂,矩阵快速幂模版题. 1 /* 2 | 1, -1 | | fn | 3 | 1, 0 | | fn-1 | 4 */ 5 #include <iostream> 6 #include <cstdio> 7 #include <cstring> 8 using namespace std; 9 typedef __int64 LL; 10 LL mod =

CodeForces 185A. Plant(矩阵快速幂)

题目链接:http://codeforces.com/problemset/problem/185/A Dwarfs have planted a very interesting plant, which is a triangle directed "upwards". This plant has an amusing feature. After one year a triangle plant directed "upwards" divides int

Xor-sequences CodeForces - 691E || 矩阵快速幂

Xor-sequences CodeForces - 691E 题意:在有n个数的数列中选k个数(可以重复选,可以不按顺序)形成一个数列,使得任意相邻两个数异或的结果转换成二进制后其中1的个数是三的倍数.求可能形成的不同数列个数(只要选出的数列中,任意两个元素在原序列中的位置不同,就算作不同的序列,比如在原数列[1,1]中选1个,那么第一个1和第二个1要分开算). 方法: 很容易列出dp方程: dp[k][i]表示取了k个,最后一个在第i位.a[i][j]表示i和j异或结果转换成二进制后1的个数

[递推+矩阵快速幂]Codeforces 1117D - Magic Gems

传送门:Educational Codeforces Round 60 – D 题意: 给定N,M(n <1e18,m <= 100) 一个magic gem可以分裂成M个普通的gem,现在需要N个gem,可以选择一定的magic gem,指定每一个分裂或不分裂,问一共有多少种方案 两种分裂方案不同当且仅当magic gem的数量不同,或者分裂的magic gem的索引不同. 思路: 1.首先从dp的角度出发 设F(i)为最终需要i个gem的方案数,容易得到递推式: (总方案数 = 最右边的m