您的位置:首页 > 其它

[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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: