赛后题解——问题 C: A^X mod P

问题 C: A^X mod P

题目描述

It’s easy for ACMer to calculate A^X mod P. Now given seven integers n, A, K, a, b, m, P, and a function f(x) which defined as following.
f(x) = K, x = 1
f(x) = (a*f(x-1) + b)%m , x > 1
Now, Your task is to calculate
( A^(f(1)) + A^(f(2)) + A^(f(3)) + … + A^(f(n)) ) modular P.

输入

In the first line there is an integer T (1 < T <= 40), which indicates the number of test cases, and then T test cases follow. A test case contains seven integers n, A, K, a, b, m, P in one line.
1 <= n <= 10^6
0 <= A, K, a, b <= 10^9
1 <= m, P <= 10^9

输出

For each case, the output format is “Case #c: ans”.
c is the case number start from 1.
ans is the answer of this problem.

样例输入

2
3 2 1 1 1 100 100
3 15 123 2 3 1000 107

样例输出

Case #1: 14
Case #2: 63

解决思路
打表出奇迹!!!
打表 f : A 0 A 1 A 2 . . . . . .   A 1 e 5 \small f:A^0 A^1 A^2......~A^{1e5} f:A0A1A2...... A1e5
打表 g : A 0 A 1 e 5 A 2 e 5 . . . . . .   A 1 e 10 \small g:A^0 A^{1e5} A^{2e5}......~A^{1e10} g:A0A1e5A2e5...... A1e10
所以 A n = A ⌊ n 1 e 5 ⌋ × 1 e 5 × A n % 1 e 5 \small A^n = A^{\lfloor \frac{n}{1e5}\rfloor \times1e5} \times A^{n\% 1e5} An=A1e5n×1e5×An%1e5

#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