以下是题目描述:
很明显的一个欧拉函数、容斥,和快速幂的问题。。。有需要总结的地方啊
——————————————————————————————————
首先对于题意来说,虽说是两人对向而行,但是二人停止的(进行黄金增加的)位置都是相同的,即如果小a在i位置停止一次,则必定在n-i的位置停止,那么他的黄金增加计算式就变为
然后找到r的条件即为找到在[1,n-1]范围内,与k互质的值的个数,这。。。。
欧拉函数的定义为:
对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。此函数以其首名研究者欧拉命名(Euler's totient function),它又称为Euler's totient function、φ函数、欧拉商数等。
然后,又因为前n个数的欧拉函数之和为(n/2)*φ(n)(或者直接容斥算约数的贡献)
因此最终的答案为(A+ B) ∗ K的(φ(n)*n)/2次方
————————————————————————————题目的思路已完成
顺便备注一下gcd函数(最大公约数)递归代码(但是这道题其实没用):
int gcd(int a,int b) {
return b == 0 ? a : gcd(b,a % b);
}
欧拉函数φ(n)的实现:
long long Oula(long long n) {
long long ans = n;
for(int i=2; i*i<=n; i++) {
if(n%i == 0) {
ans -= ans/i;
while(n%i==0) n /= i;
}
}
if(n > 1) ans -= ans/n;
return ans;
}
快速幂的long long版本:
long long Pow(long long a, long long b) {
long long tot = 1;
while(b) {
if(b & 1)
tot = tot * a % MOD;
b>>=1;
a = a * a % MOD;
}
return tot;
}
最后代入取余,求和,输出:
木得了...