• bzoj4002 [JLOI2015]有意义的字符串 快速幂


    Description

     B 君有两个好朋友,他们叫宁宁和冉冉。

    有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求((b+sqrt(D)/2)^N的整数部分,请输出结果 Mod 7528443412579576937 之后的结果吧。

    Input

    一行三个整数 b;d;n

    Output

     一行一个数表示模 7528443412579576937 之后的结果。

    Sample Input

    1 5 9

    Sample Output

    76

    HINT

     0 <b^2 < d< (b +1)2 < 10^18。

    题解

    http://blog.csdn.net/popoqqq/article/details/45148309

    沈老师的特征方程,(⊙o⊙)…,然后oj上floor it,是其部分分部分,矩阵乘法即可。

     1 #include<set>
     2 #include<map>
     3 #include<ctime>
     4 #include<queue>
     5 #include<cmath>
     6 #include<cstdio>
     7 #include<vector>
     8 #include<cstring>
     9 #include<iostream>
    10 #include<algorithm>
    11 
    12 #define ll unsigned long long
    13 #define mod 7528443412579576937UL
    14 using namespace std;
    15 ll read()
    16 {
    17     ll x=0,f=1;char ch=getchar();
    18     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    19     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    20     return x*f;
    21 }
    22 ll b,d,n,A,B;
    23 ll mul(ll a,ll b)
    24 {
    25     ll ans=0;a%=mod;
    26     for(ll i=b;i;i>>=1,a=(a+a)%mod)
    27         if(i&1)ans=(ans+a)%mod;
    28     return ans;
    29 }
    30 struct M{
    31     ll a[2][2];
    32     M(){
    33         memset(a,0,sizeof(a));
    34     }
    35     friend M operator*(M a,M b){
    36         M ans;
    37         for(int i=0;i<2;i++)
    38             for(int j=0;j<2;j++)
    39                 for(int k=0;k<2;k++)
    40                     (ans.a[i][j]+=mul(a.a[i][k],b.a[k][j]))%=mod;
    41         return ans;
    42     }
    43     friend M operator^(M a,ll b){
    44         M ans;
    45         ans.a[0][0]=ans.a[1][1]=1;
    46         for(ll i=b;i;i>>=1,a=a*a)
    47             if(i&1)ans=ans*a;
    48         return ans;
    49     }
    50 }a,ans;
    51 int main()
    52 {
    53     b=read();d=read();n=read();
    54     A=b;B=(d-b*b)/4;
    55     a.a[0][1]=1;a.a[1][0]=B;a.a[1][1]=A;
    56     ans.a[0][0]=2;ans.a[1][0]=b;
    57     int F=0;
    58     if(b*b!=d&&n%2==0)F=1;
    59     printf("%lld
    ",(((a^n)*ans).a[0][0]-F+mod)%mod);
    60 }
  • 相关阅读:
    python——数据库操作
    【笔试】T实习生2014 总结
    【JS】Intermediate6:jQuery
    【JS】Intermediate5:Scope
    【JS】Intermediate4:JSON
    【JS】Intermediate3:AJAX
    【JS】Intermediate2:Events and Callbacks
    【JS】Intermediate1:The DOM
    【JS】Beginner9:Arrays
    【JS】Beginner8:Objects
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/8142843.html
Copyright © 2020-2023  润新知