[bzoj4173]数学
2017-07-10 09:52
267 查看
题目大意
懒得写推导
[n mod k+m mod k≥k]=[n−⌊nk⌋k+m−⌊mk⌋k>=k]于是等价于
[⌊n+mk⌋−⌊nk⌋−⌊mk⌋>=1]
注意这个式子的值也只可能是0或1,因此可以写成
⌊n+mk⌋−⌊nk⌋−⌊mk⌋
代入原式
∑n+mk=1(⌊n+mk⌋−⌊nk⌋−⌊mk⌋)ϕ(k)
展开来
∑n+mk=1⌊n+mk⌋ϕ(k)−∑nk=1⌊nk⌋ϕ(k)−∑mk=1⌊mk⌋phi(k)
注意到∑ni=1⌊ni⌋ϕ(i)=∑ni=1∑d|iϕ(d)=∑ni=1i
于是你就奥妙重重的发现刚刚那条式子等于nm。
至于前面那个phi(n)和phi(m)随便求一下。
#include<cstdio> #include<algorithm> #include<cmath> #define fo(i,a,b) for(i=a;i<=b;i++) using namespace std; typedef long long ll; const int mo=998244353; ll i,j; ll n,m,l,k,t,ans; int main(){ scanf("%lld%lld",&n,&m); ans=(n%mo)*(m%mo)%mo; k=l=n; t=floor(sqrt(n)); fo(i,2,t){ if (k%i==0){ l=l/i*(i-1); while (k%i==0) k/=i; } } if (k>1) l=l/k*(k-1); ans=ans*(l%mo)%mo; k=l=m; t=floor(sqrt(m)); fo(i,2,t){ if (k%i==0){ l=l/i*(i-1); while (k%i==0) k/=i; } } if (k>1) l=l/k*(k-1); ans=ans*(l%mo)%mo; printf("%lld\n",ans); }
相关文章推荐
- bzoj 4173: 数学 (数论+sqrt求phi)
- BZOJ 4173 数学 数论
- BZOJ 4173: 数学
- 【bzoj4173】数学
- bzoj4173 数学
- 【BZOJ4173】数学 欧拉函数神题
- BZOJ 4173: 数学
- [BZOJ4173]数学(数论)
- 【欧拉函数】BZOJ4173-数学
- BZOJ-4173 数学 欧拉函数+关于余数的变换
- BZOJ 4173: 数学 欧拉函数
- bzoj 4173: 数学 欧拉函数
- 【bzoj 4173】数学
- 【BZOJ-4173】数学 欧拉函数 + 关于余数的变换
- 【bzoj4173】【数学】【数论】
- BZOJ 4173: 数学
- [BZOJ4173]数学
- 【BZOJ 4173】 数学 数论
- BZOJ4173 数学
- [BZOJ]2326: [HNOI2011]数学作业 矩阵乘法