【bzoj4173】【数学】【数论】
来源:互联网 发布:网络学硬笔书法 编辑:程序博客网 时间:2024/06/05 23:08
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 998244353using 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;}
0 0
- 【bzoj4173】【数学】【数论】
- [BZOJ4173]数学(数论)
- bzoj4173:数学
- [BZOJ4173]数学
- [bzoj4173]数学
- BZOJ4173 数学
- BZOJ4173 数学
- 【bzoj4173】数学
- 数学 数论
- 刷一波数学期望,数论,数学
- [索引] 数学 - 数论
- BZOJ 4173 数学 数论
- 数学模板 - 数论基础
- 数学训练----数论Sum
- 【BZOJ 4173】 数学 数论
- 数学/数论 杂项
- 数学&数论 知识总结
- HDU 3944 组合数学+数论
- 程序员应该遵守的编程原则
- 如何添加sdk包中的jar包
- Scala中Manifest、ClassTag、TypeTag的学习
- springMVC + mybatis 事务配置
- linux上安装jdk的方法
- 【bzoj4173】【数学】【数论】
- MPMoviePlayerViewController
- url获取参数的正则表达式
- uploadify上传
- Clear Linux/Clear container
- hdoj How Many Equations Can You Find【DFS】
- OnTouchListener触摸事件
- 那些你不可不知的xcode调试技巧
- iOS及Mac开源项目和学习资料【超级全面】