BZOJ 4407: 신의 분노 강화판 | 모비우스 반연
Ans=∑i=1n∑j=1mgcd(i,j)k
설치하다
f(d)는
gcd(x, y)=d의
(x, y) 쌍수
g(d)=∑i=1⌊nd⌋f(i∗d)=⌊nd⌋∗⌊md⌋
f(d)=∑i=1⌊nd⌋u(i)∗g(i∗d)=∑i=1⌊nd⌋u(i)∗⌊md∗i⌋∗⌊nd∗i⌋
Ans=∑d=1ndk∑i=1⌊nd⌋u(i)∗⌊md∗i⌋∗⌊nd∗i⌋
이때 두 번 블록을 나누면 한 번의 심문을 할 수 있다
O(n)하지만 아직 부족해요.
계속 등가 변환령
T=d∗i
Ans=∑T=1n⌊nT⌋∗⌊mT⌋∑d|Tdk∗u(Td)
h(T)=∑d|Tdk∗u(Td)
만들기만 하면 돼요.
h(T)의 접두사와 블록으로 처리하면 단일 질문을 할 수 있습니다.
n√의 복잡도
그 다음은 귀신 짐승의 선형 체인데, 용님께 감사를 드려야 한다.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define N 5000005
#define ll long long
#define R 1000000007ll
using namespace std;
int sc()
{
int i=0,f=1; char c=getchar();
while(c>'9'||c<'0'){if(f=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
return i;
}
ll f[N],K;
int prime[N],low[N];
int a[N],n;
ll cal(ll x)
{
ll ans=1,y=K;
while(y)
{
if(y&1)ans=ans*x%R;
x=x*x%R;
y>>=1;
}
return (ans-1+R)%R;
}
void pre()
{
int top=0; f[1]=low[1]=1;
for(int i=2;iif(!a[i])
{
low[i]=prime[++top]=i;
f[i]=cal(i);
}
for(int j=1;i*prime[j]*prime[j]]=1;
if(i%prime[j]==0)
{
low[i*prime[j]]=low[i]*prime[j];
if(low[i]==i)
f[i*prime[j]]=f[i]*(f[prime[j]]+1)%R;
else
f[i*prime[j]]=f[i/low[i]]*f[low[i]*prime[j]]%R;
break;
}
low[i*prime[j]]=prime[j];
f[i*prime[j]]=f[i]*f[prime[j]]%R;
}
}
for(int i=2;i1])%R;
}
int main()
{
n=sc(),K=sc();
pre();
while(n--)
{
ll ans=0;
int n=sc(),m=sc();
if(n>m)swap(n,m);
for(int i=1,last;i<=n;i=last+1)
{
last=min(n/(n/i),m/(m/i));
ans=(ans+((ll)(n/i)*(m/i)%R)*(R+f[last]-f[i-1])%R)%R;
}
printf("%lld
",ans);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[BZOJ1101] [POI2007] Zap(모비우스 역극)전송문 마지막에 모양을 이렇게 했어요. ∑i=1adμ(i)⌊⌊ad⌋i⌋⌊⌊bd⌋i⌋ 블록을 나누어 시간을 구하다 O(a√+b√)...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.