BZOJ 4002 有意义的字符串

Posted ziliuziliu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于BZOJ 4002 有意义的字符串的主要内容,如果未能解决你的问题,请参考以下文章

bzoj4002有意义的字符串

BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法

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

bzoj4002[JLOI2015]有意义的字符串 数论+矩阵乘法

luogu3263/bzoj4002 有意义的字符串 (数学+矩阵快速幂)

[JLOI2015]有意义的字符串