您的位置:首页 > 其它

bzoj4173 数学

2018-03-09 22:06 375 查看

Description



N,M<=10^15

Solution

首先需要知道一个结论,若n%k+m%k≥kn%k+m%k≥k ,则⌊n+mk⌋−⌊nk⌋−⌊mk⌋=1⌊n+mk⌋−⌊nk⌋−⌊mk⌋=1

证明如下:

显然可以设n=a1k+r1n=a1k+r1,m=a2k+r2m=a2k+r2,那么⌊n+mk⌋=a1+a2+1⌊n+mk⌋=a1+a2+1,⌊nk⌋=a1⌊nk⌋=a1,⌊mk⌋=a2⌊mk⌋=a2

因为r1+r2≥kr1+r2≥k因此⌊r1+r2k⌋=1⌊r1+r2k⌋=1

现在令t=∑n%k+m%k≥kφ(k)t=∑n%k+m%k≥kφ(k),显然答案就是φ(n)∗φ(m)∗tφ(n)∗φ(m)∗t

那么有t=∑n%k+m%k≥kφ(k)=∑n+mk=1φ(k)[⌊n+mk⌋−⌊nk⌋−⌊mk⌋=1]t=∑n%k+m%k≥kφ(k)=∑k=1n+mφ(k)[⌊n+mk⌋−⌊nk⌋−⌊mk⌋=1]

我们发现后面那一坨布尔表达式不为0就为1,那么有t=∑n+mk=1φ(k)(⌊n+mk⌋−⌊nk⌋−⌊mk⌋)t=∑k=1n+mφ(k)(⌊n+mk⌋−⌊nk⌋−⌊mk⌋),可以感受一下区别

那么拆一下就成了t=∑n+mk=1φ(k)⌊n+mk⌋−∑nk=1φ(k)⌊nk⌋−∑mk=1φ(k)⌊mk⌋t=∑k=1n+mφ(k)⌊n+mk⌋−∑k=1nφ(k)⌊nk⌋−∑k=1mφ(k)⌊mk⌋

考虑一下∑nk=1φ(k)⌊nk⌋∑k=1nφ(k)⌊nk⌋的意义,有∑nk=1φ(k)⌊nk⌋=∑nk=1∑⌊nk⌋i=1φ(k)=∑ni=1∑k|iφ(k)=∑ni=1i∑k=1nφ(k)⌊nk⌋=∑k=1n∑i=1⌊nk⌋φ(k)=∑i=1n∑k|iφ(k)=∑i=1ni

辣莫t=12[(n+m)(n+m+1)−n(n+1)−m(m+1)]=nmt=12[(n+m)(n+m+1)−n(n+1)−m(m+1)]=nm

即ans=φ(n)∗φ(m)∗nmans=φ(n)∗φ(m)∗nm

惊喜不惊喜,意外不意外

Code

#include <stdio.h>
#include <string.h>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)

typedef long long LL;
const int MOD=998244353;

void cal(LL &ret,LL x) {
ret=ret/x;
ret=ret*(x-1);
}

LL get_phi(LL n) {
LL ret=n;
for (LL i=2;i*i<=n;i++) {
if (n%i) continue;
cal(ret,i);
while (n%i==0) n/=i;
}
if (n!=1) ret=(ret/n)*(n-1);
return ret;
}

int main(void) {
LL n,m; scanf("%lld%lld",&n,&m);
printf("%lld\n",n%MOD*m%MOD*(get_phi(m)%MOD)%MOD*(get_phi(n)%MOD)%MOD);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: