牛客训练营1-D

 以下是题目描述:

 

 

 

 很明显的一个欧拉函数、容斥,和快速幂的问题。。。有需要总结的地方啊

——————————————————————————————————

首先对于题意来说,虽说是两人对向而行,但是二人停止的(进行黄金增加的)位置都是相同的,即如果小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;
}

最后代入取余,求和,输出:

木得了...

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值