A^X mod P(山东第四届省赛)

mac2022-06-30  23

Description

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. 

Input

 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

Output

 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.

Sample

Input

2

3 2 1 1 1 100 100

3 15 123 2 3 1000 107

Output

Case #1: 14 Case #2: 63

Hint

 

Source

2013年山东省第四届ACM大学生程序设计竞赛     附上一段会T的代码: #include <stdio.h> #include <vector> #include <string.h> #include <iostream> #include <algorithm> #include <queue> using namespace std; #define ll long long const int inf = 0xffffff; const int maxn = 1e6+8; int n, t; ll A, K, a, b, m, P, f[maxn], fi[maxn]; ll qsm(ll x, ll y, ll z) { ll ans = 1; while(y) { if(y&1) { ans = ans*x%z; } x = x*x%z; y >>= 1; } return ans; } int main() { scanf("%d", &t); int ga = t; while(t--) { ll sum; scanf("%d%lld%lld%lld%lld%lld%lld", &n, &A, &K, &a, &b, &m, &P); ll miao = K;//存下第一项,f(x) = k sum = qsm(A, K, P);//存下第一项 A^(f(1))%P for(int i = 1; i<n; i++) { miao = (a*miao+b)%m;//由题可知,后一项等于 a*前一项+b,这里是依次算出以后的每一个f(i) sum = (sum+qsm(A, miao, P))%P;//这里是依次算出A^(f(i))%P } printf("Case #%d: %lld\n", ga-t, sum); } return 0; }

 

转载于:https://www.cnblogs.com/RootVount/p/10679767.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)