I won't tell you this is about number theory
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 458 Accepted Submission(s): 142
Problem Description
To think of a beautiful problem description is so hard for me that let's just drop them off. :)
Given four integers a,m,n,k,and S = gcd(a^m-1,a^n-1)%k,calculate the S.
Given four integers a,m,n,k,and S = gcd(a^m-1,a^n-1)%k,calculate the S.
Input
The first line contain a t,then t cases followed.
Each case contain four integers a,m,n,k(1<=a,m,n,k<=10000).
Each case contain four integers a,m,n,k(1<=a,m,n,k<=10000).
Output
One line with a integer S.
Sample Input
1 1 1 1 1
Sample Output
0
Author
Teddy
Source
这道题要知道这个公式:
gcd(a
m-1,a
n-1) = a
gcd(m,n)-1
推广:
若 gcd(a,b)=1
gcd(a
m-b
m,a
n-b
n) = a
gcd(m,n)-b
gcd(m,n)
#include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> using namespace std; typedef long long LL; LL pow_mod(LL a,LL n,LL mod){ LL ans = 1; while(n){ if(n&1) ans = ans*a%mod; a=a*a%mod; n=n>>1; } return ans; } LL gcd(LL a,LL b){ return b==0?a:gcd(b,a%b); } int main() { int tcase; scanf("%d",&tcase); while(tcase--){ LL a,m,n,k; scanf("%lld%lld%lld%lld",&a,&m,&n,&k); LL t = gcd(m,n); LL ans = (pow_mod(a,t,k)-1+k)%k; printf("%lld\n",ans); } return 0; }