BZOJ 4002 有意义的字符串

WA一下午的原因是矩阵有两个值打反了。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll unsigned long long
#define mod 7528443412579576937UL
using namespace std;
struct matrix
{
    ll a[3][3];
}p,q;
ll b,d,n;
ll read()
{
    char ch;ll data=0;
    while (ch<‘0‘ || ch>‘9‘) ch=getchar();
    while (ch>=‘0‘ && ch<=‘9‘)
    {
        data=data*10+ch-‘0‘;
        ch=getchar();
    }
    return data;
}
ll mull(ll a,ll b)
{
    a%=mod;b%=mod;
    ll ans=0,base=b;
    while (a)
    {
        if (a&1) ans=(ans+base)%mod;
        base=(base+base)%mod;
        a>>=1;
    }
    return ans;
}
void get_table()
{
    p.a[1][1]=2;p.a[1][2]=b;
    q.a[1][1]=0;q.a[2][1]=1;q.a[1][2]=(d-b*b)/4;q.a[2][2]=b;
}
matrix mul(matrix a,matrix b)
{
    matrix c;
    for (ll i=0;i<=2;i++)
        for (ll j=0;j<=2;j++)
            c.a[i][j]=0;
    for (ll i=1;i<=2;i++)
        for (ll j=1;j<=2;j++)
            for (ll k=1;k<=2;k++)
                c.a[i][j]=(c.a[i][j]+mull(a.a[i][k],b.a[k][j]))%mod;
    return c;
}
void f_pow(ll y)
{
    matrix base=q;
    while (y)
    {
        if (y&1) p=mul(p,base);
        base=mul(base,base);
            y>>=1;
    }
}
int main()
{
    b=read();d=read();n=read();
    get_table();
    f_pow(n);
    if (b*n==d) printf("%lld\n",p.a[1][1]%mod);
    else if (n%2) printf("%lld\n",p.a[1][1]%mod);
    else printf("%lld\n",(p.a[1][1]-1+mod)%mod);
    return 0;
}
时间: 2024-12-28 02:20:32

BZOJ 4002 有意义的字符串的相关文章

BZOJ 4002~4007 JLOI2015 代码

题解戳这里 4002 有意义的字符串: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define P 7528443412579576937ull using namespace std; typedef unsigned long long ull; ull b,d,n; ull Times(ull

【BZOJ】【4002】【JLOI2015】有意义的字符串

构造线性递推式+矩阵乘法 题解戳PoPoQQQ 为了自己以后看的方便手打一遍好了>_> 求$( \frac{b+\sqrt{d}}{2} )^n$的整数部分对p取模后的值 其中$b\mod 2=1,d\mod 4=1,b^2 \leq d<(b+1)^2,n\leq10^{18}$ 思路: 构造数列$a_n=b*a_{n-1}+\frac{d-b^2}{4}*a_{n-2}$ 其中$a_0=2,a_1=b$ 然后我们求出这个数列的通项公式,得到$a_n=(\frac{b+\sqrt{d}

bzoj4002[JLOI2015]有意义的字符串

bzoj4002[JLOI2015]有意义的字符串 题意: 求((b+√d)/2)^n的整数部分.b*b<d<10^18,n<10^18,d%4==1,b*b%4==1,模数约等于7*10^18 题解: 神题.由一些性质可以得出一个数列:An=bAn-1+(d-b*b)/4*An-2,且这个数列的通项公式为An=((b+√d)/2)^n+((b-√d)/2)^n,且由题目条件得(d-b*b)/4为正整数,故可以用矩阵乘法求出An,由于(b-√d)/2∈(-1,0],故答案为(An)-1当

bzoj 4002: [JLOI2015]有意义的字符串

这个题... 1 #include <bits/stdc++.h> 2 #define rep(i, a, b) for (int i = a; i <= b; i++) 3 #define drep(i, a, b) for (int i = a; i >= b; i--) 4 #define REP(i, a, b) for (int i = a; i < b; i++) 5 #define mp make_pair 6 #define pb push_back 7 #d

【BZOJ】【3473】字符串

后缀数组 Orz zyf 神题不会做啊,先坑着吧……sigh 1 //BZOJ 3473 2 #include<vector> 3 #include<cstdio> 4 #include<cstring> 5 #include<cstdlib> 6 #include<iostream> 7 #include<algorithm> 8 #define rep(i,n) for(int i=0;i<n;++i) 9 #define

JLOI2015 有意义的字符串

Description Input 一行三个整数b, d, n. Output 一行一个数表示模7528443412579576937 之后的结果. Sample Input 输入1:1 5 9输入2:11 125 6715504 Sample Output 输出1:76输出2:1499928102740042526 Data Constraint 好吧.一直没看懂题目名到底有意义在哪= = 进入正题 首先我们发现(b+sqrt(d))/2可以是某个方程的解,它符合(-b+sqrt(b*b-4a

BZOJ 3555: [Ctsc2014]企鹅QQ [字符串哈希]【学习笔记】

3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2046  Solved: 749[Submit][Status][Discuss] Description PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体验,满足用户对社交.资讯.娱乐.交易等多方面的需求.小Q是Pe

【BZOJ】4259: 残缺的字符串

[题意]给定长度为m的匹配串B和长度为n的模板串A,求B在A中出现多少次.字符串仅由小写字母和通配符" * "组成,其中通配符可以充当任意一个字符.n<=3*10^5. [算法]FFT [题解]假设模板串的数组A用0~26代表所有字符,0为通配符,匹配串的数组B同理,那么用表示差异的经典套路: $$C_n=\sum_{i=0}^{m-1}(A_{n+i}-B_i)^2*A_{n+i}*B_i$$ 那么可以看出$C_n=0$当且仅当$S_A[n,n+m-1]=S_B[0,m-1]$

bzoj 4259 4259: 残缺的字符串【FFT】

和bzoj 4503 https://www.cnblogs.com/lokiii/p/10032311.html 差不多,就是再乘上一个原串字符 有点卡常,先在点值下算最后一起IDFT #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int N=1100005; int n,m,bt,lm,re[N],tot;