bzoj4173:数学

bzoj4173:数学


φ(n)φ(m)kφ(k)e(m%k+n%kk)
这玩意儿一眼不可做的感觉,
我们现在的任务是求出一个玩意儿,使得他与 e(m%k+n%kk) 相同。
我们不妨设 n=q1k+r1,m=q2k+r2
那么我们要构造的东西需要满足
{1 if r1+r2k0 if r1+r2<k
我们发现 (n+m)=(q1+q2)k+(r1+r2)
这东西将 r1r2 结合在了一起.
最后构造出的东西显然就是
n+mknkmk
我们最后要求的就变成了 φ(n)φ(m)kφ(k)(n+mknkmk)
不难发现 f(n)=ni=1φ(i)ni=ni=1d|iφ(d)=ni=1i
最后的式子就变成了 φ(n)φ(m)(f(n+m)f(n)f(m))
这三个 f 加加减减就变成了φ(n)φ(m)nm
剩下的东西就so easy了

#include<cstdio>
#include<algorithm>

typedef long long ll;
const int Mod = 998244353;
ll n, m;

ll phi (ll x) {
    ll ans = x;
    for (int i = 2; 1ll * i * i <= x; ++i) if (x % i == 0) {
        ans = ans / i * (i - 1);
        while (x % i == 0) x /= i;
    }
    if (x != 1) ans = ans / x * (x - 1);
    return ans % Mod;
}

int main () {
    scanf ("%lld%lld", &n, &m);
    printf ("%lld\n", phi (n) * phi (m) % Mod * (n % Mod) % Mod * (m % Mod) % Mod);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值