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-4ac))/2a的形式。

我们发现这个方程是x^2=bx+(d-b^2)/4;

我们假设一个数列f[n]=((b+sqrt(d))/2)^n;

由刚才的方程可得f[n]满足f[n]=bf[n-1]+(d-b^2)/4*f[n-2]

所以对于((b+sqrt(d))/2的n次方我们可以矩乘快速幂求得。

但实数直接上mod是会挂的!

我们接着发现方程另外一根为((b-sqrt(d))/2;

那么它同样满足上面的递推式

我们设h[n]=((b+sqrt(d))/2)^n+((b+sqrt(d))/2)^n,那么h[n]同样满足递推式,而且h[n]是整数!!!

又因为((b+sqrt(d)/2)^n绝对值小于1,所以它的影响我们可以直接特判,

就这样,

另外,由于mod的数太大,乘法我们要用快速乘实现

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>

using namespace std;
typedef long long ll;

struct Matrix{
    ll a[4][4];
    int n,m;
}dw,dl,y;

ll mo=7528443412579576937ll;
ll ans,n,b,d;

ll add(ll a,ll b)
{
    ll lef;
    lef=mo-a;
    if(b<=lef)a=a+b;
    else a=b-lef;
    return a;
}

ll mul(ll a,ll b)
{
    ll l;
    l=0;
    while(b){
        if(b%2==1)l=add(l,a);
        a=add(a,a);
        b/=2;
    }
    return l;
}

Matrix operator *(Matrix a,Matrix b)
{
    Matrix c;
    int i,j,k;
    memset(c.a,0,sizeof(c.a));
    c.n=a.n;c.m=b.m;
    for(i=1;i<=a.n;i++)
        for(j=1;j<=b.m;j++){
            c.a[i][j]=0;
            for(k=1;k<=a.m;k++)c.a[i][j]=add(c.a[i][j],mul(a.a[i][k],b.a[k][j]));
        }
    return c;
}

Matrix mi(Matrix x,ll z)
{
    Matrix l;
    l.n=l.m=2;
    memset(l.a,0,sizeof(l.a));
    l.a[1][1]=1;l.a[2][2]=1;
    while(z){
        if(z%2==1)l=l*x;
        x=x*x;
        z/=2;
    }
    return l;
}

int main()
{
    scanf("%lld%lld%lld",&b,&d,&n);
    dw.a[1][1]=0;dw.a[1][2]=(d-b*b)/4;
    dw.a[2][1]=1;dw.a[2][2]=b;
    dw.n=dw.m=2;
    dl=mi(dw,n);
    if(n==0)ans=1;
    else{
        ans=mul(dl.a[1][1],2);
        ans=add(ans,mul(b,dl.a[2][1]));
        if(d!=b*b&&n%2==0)ans--;
        if(ans<0)ans+=mo;
    }
    printf("%lld\n",ans);
}
时间: 2024-10-24 23:50:59

JLOI2015 有意义的字符串的相关文章

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

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

题目描述 B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 输入 一行三个整数 b;d;n 输出 一行一个数表示模 7528443412579576937 之后的结果. 样例输入 1 5 9 样例输出 76 提示 其中 0<b^2<=d<(b+1)^2<=10^18,n<=10^18,并且 b mod 2=1,d mod 4=1 题解 数论 高中数学 注意题目中给出的0<b^2<=d<(b+1)^2,这说明了什么?

luogu P3263 [JLOI2015]有意义的字符串

luogu 兄弟会背叛你,女人会离开你,金钱会诱惑你,生活会刁难你,只有数学不会,不会就是不会,怎么学都不会. 先记\(A=\frac{b+\sqrt{d}}{2}\),出现这种东西不妨考虑他的"共轭项"",记\(B=\frac{b-\sqrt{d}}{2}\).可以发现\(A+B=b,AB=\frac{b^2-d}{4}\),并且由于\(b\bmod 2=1,d\bmod 4=1\),所以\(AB\)的值一定是个整数 现在要求\(\lfloor A^n\rfloor\),由

【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】有意义的字符串 推公式+矩阵乘法

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/45174449"); } 题解: 公式推导部分:见大爷博客http://blog.csdn.net/popoqqq/article/details/45148309 公式: fi=b×fi?1+ (d?b2)4ai?2 f0=2,f1

JLOI 2015--有意义的字符串(矩阵乘法)

知道公式就不难了系列... 感觉吉林省选好变态...这还只是第一题呀... %dalaoPoPoQQQ... 看了大佬的题解...懵逼了一晚... 今天早上的时候终于想明白了!!! 于是飞快地A过此题... 题意 B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 注意:其中 0<b^2< = d<(b+1)^2< = 10^18,  n< = 10^18,并且 b mod 2=1,d mod 4=1 Solution 构造特征方程.

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];

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

首先我们发现$\frac{b+\sqrt{d}}{2}$这个形式好像一元二次方程的求根公式啊(???反正我发现不了) 然后我们又想到虽然这个东西不好求但是$(\frac{b-\sqrt{d}}{2})^n$好像挺好求的啊(???反正我想不到)(由题目给的范围,这玩意在(-1,1)) 于是把这个方程写出来:$x^2-b+\frac{b^2-d}{4}=0$,设它的两根是$x_1=\frac{b+\sqrt{d}}{2} , x_2=\frac{b-\sqrt{d}}{2}$ 于是就是要求$\lfl