【bzoj4173】【数学】【数论】

本文解析了一道关于数学算法的题目,通过将原始条件转化为更容易理解的形式,并利用数论中的欧拉函数进行计算,最终简化为等差数列求和问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

 

Input

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

Output

 如题

Sample Input

5 6

Sample Output

240

HINT

 N,M<=10^15

题解:一看就是一个推式子的题。。

首先把条件变形一下,把取模换成整除。

然后不等式两边都除个k.

再稍微分析一下。把不等号变成等号

就是 (n+m)/k=n/k+m/k+1;

然后把这个东西带入到原式子(先不管前面两项)。

就是

   sigma(k)phi(k)*(n+m)/k(1<=k<=n+m)-sigma(k)phi(k)*n/k(1<=k<=n)-sigma(k)phi(k)*m/k(1<=k<=m)

sigma(k)phi(k)*x/k(1<=k<=x)可以化成sigma(t)sigma(k)phi(k)(1<=t<=x,k|t);

又因为 sigma(t)phi(t)(t|n)=n;

所以就成了sigma(i)i(1<=i<=n+m)-sigma(i)i(1<=i<=n)-sigma(i)i(1<=i<=m)

用等差数列求和公式求一下在乘上phi(n)和phi(m)就好了。

最后的式子就是n*m*phi(n)*phi(m);

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#define P 998244353
using namespace std;
long long n,m,ans;
long long phi(long long x)
{
  long long ans=x,m=x;
  for (long long i=2;i<=sqrt(x);i++)
    if (m%i==0){ans=ans/i*(i-1);while (m%i==0) m/=i;}
   if (m>1) ans=ans/m*(m-1);
   return ans;	
}
int main()
{
  cin>>n>>m;
  ans=((n%P)*(m%P))%P*(phi(n)%P)%P*(phi(m)%P)%P;
  cout<<ans<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值