[プッシュ]エクスプレスブロックP5110

あまりにも多くの食べ物は、機能を生成しない、この質問を書くために特性方程式を使用します

まず、フォームの知っている\(A_N = A * A_ { N-1} +のB * A_ {N-2} \) のための特性方程式である\(X ^ 2 = A * X + B \)

だから、この質問は、再帰的な式は次のとおりです\(X ^ 2 = 233x + 666 \) すなわち:\(X ^ 0 = 2-233x-666 \)

二次-式によって得られた溶液:\(X_1 = \ {233+ dfracの\のSQRT {56953} {2}}、X_2 = \ {SQRT \ dfrac 233- {56953} {2}} \)

ための\(188305837≡SQRT {56953} \ (MOD \ 1E9 + 7)\)

それは次のようになります。$ X_1 = \(94153035 \) $、\(X_2 = 905 847 205 \)

特性方程式との結論によると:\(^ N-αx_1= A_N +ベータ] * n型X_2 ^ \)

以降\(A_0 = 0、1 = A_1 \)があるので。

\(A + B = 0 \)

\(94153035 * A * B + 905847205 = 1 \)

溶液が得られた:\(。。α= \ dfrac 1 {{}} 188 305 837 233 230 706 =、=ベータ] - \ dfrac 1} {} = {188 305 837 - 233 230 706 \)

だから、\(A_N = 233230706 * 94153035 ^ N-233230706 * 905847205 ^ n個\)

我々が使用する理由ですお問い合わせ、として\(O(1)\)解決するために、光パワーの速度を

\(コード:\)

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define re register
il int read() {
    re int x = 0, f = 1; re char c = getchar();
    while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
    return x * f;
}
#define rep(i, s, t) for(re int i = s; i <= t; ++ i)
#define maxn 300
const int mod = 1000000007;
const int x1 = 94153035, x2 = 905847205, a = 233230706;
int n, m, ans;
int f1[65540], f2[65540], f3[65540], f4[65540];
int g1[65540], g2[65540], g3[65540], g4[65540];
unsigned long long SA,SB,SC;
void init(){scanf("%llu%llu%llu",&SA,&SB,&SC);}
unsigned long long Rand() {
    SA^=SA<<32,SA^=SA>>13,SA^=SA<<1;
    unsigned long long t=SA;
    SA=SB,SB=SC,SC^=t^SA;return SC;
}
il int mul(int a, int b) {
    return 1ll * a * b % mod;
}
il int qpow1(int x) {
    return mul(f1[x & 65535], f2[x >> 16]);
}
il int qpow2(int x) {
    return mul(g1[x & 65535], g2[x >> 16]);
}
int main() {
    f1[0] = g1[0] = 1;
    rep(i, 1, 65536) f1[i] = mul(f1[i - 1], x1), g1[i] = mul(g1[i - 1], x2);
    f2[0] = g2[0] = 1, f2[1] = f1[65536], g2[1] = g1[65536];
    rep(i, 2, 65536) f2[i] = mul(f2[i - 1], f2[1]), g2[i] = mul(g2[i - 1], g2[1]);
    int T = read(); init();
    while(T --) {
        n = (Rand()) % (mod - 1);
        ans ^= 1ll * a * (qpow1(n) - qpow2(n) + mod) % mod;
    }
    printf("%d", ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/bcoier/p/11774639.html