「LibreOJ β Round #4」求和
Posted 日拱一卒 功不唐捐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「LibreOJ β Round #4」求和相关的知识,希望对你有一定的参考价值。
https://loj.ac/problem/528
1 , d =1
μ(d)= (-1)^k , d=p1*p2*p3*^pk pi为素数
0 , d=除以上的其他数
所以题意转化:有多少对数的gcd相同质因子只有1个
考虑容斥原理
令f(x)表示 有多少对数的gcd含有x^2这个因子
可能有一对数的gcd含有多个x^2
那么答案最终呈现 tot-f(x1)+f(x2)- f(x3)+ f(x4)……的形式
容斥系数为miu(x)
所以ans=miu(1)*f(1)+miu(2)*f(2)+miu(3)*f(3)……
f怎么算?
每隔x^2个数中一定有一个能整除x^2
所以f(x)= n/x^2 * m/x^2
#include<cmath> #include<cstdio> #include<iostream> #define N 3200001 #define mod 998244353 using namespace std; typedef long long LL; bool vis[N]; int p[N],miu[N],cnt; void pre() { miu[1]=1; for(int i=2;i<N;i++) { if(!vis[i]) { p[++cnt]=i; miu[i]=-1; } for(int j=1;j<=cnt;j++) { if(i*p[j]>=N) break; vis[i*p[j]]=true; if(i%p[j]==0) break; miu[i*p[j]]=-miu[i]; } } } void read(LL &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-\'0\'; c=getchar(); } } int main() { pre(); LL n,m; read(n); read(m); int maxn=min(sqrt(n),sqrt(m)); int ans=0; for(int i=1;i<=maxn;i++) ans=(ans+miu[i]*(n/(1ll*i*i)%mod)*(m/(1ll*i*i)%mod)%mod+mod)%mod; printf("%d",ans); }
以上是关于「LibreOJ β Round #4」求和的主要内容,如果未能解决你的问题,请参考以下文章
LibreOJ「LibreOJ β Round #4」 游戏
LibreOJ #526. 「LibreOJ β Round #4」子集
LibreOJ #525. 「LibreOJ β Round #4」多项式