試合後の問題の解決策-問題C:A ^ X mod P

質問C:A ^ X mod P

タイトル説明

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}fA0 A1 A2A 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}gA0 A1 e 5 A図2は、電子5A 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=A1 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;
}

おすすめ

転載: blog.csdn.net/qq_45739057/article/details/108427978