您的位置:首页 > 其它

BZOJ 4173: 数学

2017-03-23 20:07 399 查看

Description



Input

输入文件的第一行输入两个正整数 。

Output

如题

Sample Input

5 6

Sample Output

240

HINT

N,M<=10^15

分析

我们可以转换一下条件 m%k + n%k >= k等价于 ⌊n+mk⌋−⌊nk⌋ −⌊mk⌋=1

无视掉前面的φ(n)∗φ(m)的话答案就是 ∑i=1n+mϕ(i)∗⌊n+mk⌋−∑i=1nϕ(i)∗⌊nk⌋−∑i=1mϕ(i)∗⌊mk⌋

我们由定理∑k|iϕ(k)=i易得出上式可化简为n∗m,那么答案就为ϕ(n)∗ϕ(m)∗n∗m。

代码

#include <bits/stdc++.h>

#define MOD 998244353
#define ll long long

ll read()
{
ll x = 0;
ll f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}

ll phi(ll n)
{
ll tmp = n;
for (ll i = 2; i * i <= n; i++)
{
if (n % i == 0)
{
tmp /= i;
tmp *= i - 1;
while (n % i == 0)
n /= i;
}
}

if (n != 1)
tmp /= n, tmp *= n - 1;
return tmp;
}

int main()
{
ll n,m;
n = read();
m = read();
std::cout<<(phi(n) % MOD) * (phi(m) % MOD) % MOD * (n % MOD) % MOD * (m % MOD) % MOD<<std::endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: