タイトル説明
ACMerがA ^ X mod Pを計算するのは簡単です。ここで、7つの整数n、A、K、a、b、m、P、および次のように定義された関数f(x)が与えられます。
f(x)= K、x = 1
f(x)=(a * f(x-1)+ b)%m、x> 1
ここで、タスクは
(A ^(f(1))+を計算することです。A ^(f(2))+ A ^(f(3))+…+ A ^(f(n)))モジュラーP。
入る
最初の行には、テストケースの数を示す整数T(1 <T <= 40)があり、その後にT個のテストケースが続きます。テストケースには、7つの整数n、A、K、a、b、m、Pが1行に含まれています。
1 <= n <= 10 ^ 6
0 <= A、K、a、b <= 10 ^ 9
1 <= m、P <= 10 ^ 9
出力
いずれの場合も、出力形式は「ケース#c:ans」です。
cは1から始まるケース番号です
。ansはこの問題の答えです。
サンプル入力
2
3 2 1 1
1100100 3 15123 2 3 1000107
サンプル出力
ケース#1:14
ケース#2:63
アイデアを解き、
奇跡を起こす!!!
表f:A 0 A 1 A 2 ..... A 1 e 5 \ small f:A ^ 0 A ^ 1 A ^ 2 ...... 〜A ^ {1e5}f:A0 A1 A2。。。。。。A 1 e 5
打表:A 0 A 1 e 5 A 2 e5。。。。。。A 1 e 10 \ small g:A ^ 0 A ^ {1e5} A ^ {2e5} ...... 〜A ^ {1e10}g:A0 A1 e 5 A図2は、電子5。。。。。。A 1 E 1 0
所以A N = A⌊N 1、E 5⌋×1、E 5×A N%1 E 5 \小さなA ^ N = A ^ {\ lfloor \ FRAC {N} {1E5} \ rfloor \ times1e5} \ times A ^ {n \%1e5}An=A⌊1 e 5n個⌋ × 1 E 5××An %1 e 5
#include<stack>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
ll n, A, K, a, b, m, p;
ll f[N], g[N];
inline ll mod_m(ll n) {
return n % m; }
inline ll mod_p(ll n) {
return n % p; }
void init(const int n = 1e5) {
f[0] = g[0] = 1;
for (int i = 1; i <= n; i++) {
f[i] = mod_p(f[i - 1] * A);
}
g[1] = f[n];
for (int i = 1; i <= n; i++) {
g[i] = mod_p(g[i - 1] * g[1]);
}
}
int main() {
int T; cin >> T;
for (register int t = 1; t <= T; t++) {
cin >> n >> A >> K >> a >> b >> m >> p;
init();
ll ans = mod_p(f[K % 100000] * g[K / 100000]), sv = K;
for (register int i = 2; i <= n; i++) {
sv = mod_m(sv * a + b);
ans = mod_p(ans + mod_p(f[sv % 100000] * g[sv / 100000]));
}
printf("Case #%d: %lld\n", t, ans);
}
return 0;
}