BZOJ 2694: Lcm 莫比乌斯反演 + 积性函数 + 线性筛 + 卡常

Code:

#include<bits/stdc++.h>
#define maxn 4020002
#define ll long long 
#define M 4000001
using namespace std;
#define O2 __attribute__((optimize("-O2")))
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd() {int x=0; char c=nc(); while(c<48) c=nc(); while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x;}
void setIO(string s)
{
	string in=s+".in"; 
	string out=s+".out"; 
	freopen(in.c_str(),"r",stdin); 
	freopen(out.c_str(),"w",stdout); 
}
int cnt; 
bool vis[maxn]; 
int prime[maxn], mu[maxn];
ll g[maxn],mod=1,sum[maxn];  
O2 inline void Init()
{
	int i,j; 
	mu[1]=1;
	for(i=1;i<=30;++i) mod=mod*2;        
	for(i=2;i<=M;++i)
	{
		if(!vis[i]) prime[++cnt]=i, mu[i]=-1; 
		for(j=1;j<=cnt&&1ll*prime[j]*i<=M;++j) 
		{
			vis[prime[j]*i]=1; 
			if(i%prime[j]==0) 
			{
				mu[i*prime[j]]=0; 
				break; 
			}
			mu[i*prime[j]]=-mu[i]; 
		}
	} 
	for(i=1;i<=M;++i)
		for(j=1;1ll*i*j<=M;++j)  
			if(mu[j]) g[i*j]+=mu[i]*i, g[i*j]%mod; 
	for(i=1;i<=M;++i) g[i]=(1ll*g[i]*i+g[i-1]+mod)%mod;  
	for(i=1;i<=M;++i) sum[i]=(1ll*(i+1)*i/2)%mod; 
} 
O2 int main()
{
	// setIO("input");
	Init(); 
	int T,n,m; 
	T=rd(); 
	while(T--)
	{
		n=rd(), m=rd(); 
		if(n>m) swap(n,m); 
		int i,j; 
	    ll re=0; 
	    for(i=1;i<=n;i=j+1)
	    {
		    j=min(n/(n/i), m/(m/i)); 
		    re=(re + (1ll*sum[n/i]*sum[m/i]*(g[j]-g[i-1])%mod)%mod + mod)%mod; 
	    }
	    printf("%lld\n",re); 
	}
	return 0; 
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值