原题链接:传送门
题意:给四个数 n,k,A,B。小a会从1走到n-1,小b从n-1走到1。小a当前位置记为x,小b当前位置记为y。当gcd(x,n)==1
时,小a的黄金A会变为A * kx,gcd(y,n) == 1
时,小b的黄金B会变为B * ky。问小a走到n-1时,他们手中的黄金数为多少。
思路:主要就是求1到n-1中与n互质的数之和——可以用欧拉来求,公式phi[n]*n/2
可以直接求出n以内与n互质的数之和。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10;
const ll Mod = 1e9+7;
ll Pow(ll a,ll b){
ll r = 1,base = a;
while(b){
if(b&1) r = r*base % Mod;
base = base*base % Mod;
b >>= 1;
}
return r%Mod;
}
ll Eular(ll n){
ll res = n;
for(ll i=2;i*i<=n;i++){
if(n%i==0) res = res/i*(i-1);
while(n%i==0) n/=i;
}
if(n > 1) res = res/n*(n-1);
return res;
}
int main(){
ll n,k,a,b;
scanf("%lld%lld%lld%lld",&n,&k,&a,&b);
ll sum = n*Eular(n)/2;
printf("%lld\n",(a+b)*Pow(k,sum)%Mod);
return 0;
}