PGCD2 - Primes in GCD Table (Hard)
这题肝了三四天,其他啥也没做...
然后...双倍经验
不知道为什么会脑抽去帮 LZ_101 大佬验题...
题目和被 A 穿的 PGCD 一样,数据范围变成大概 2e11 ...
于是我们就要考虑用更加优秀的做法去解决这道题了
首先我们得想到 PGCD 中最优秀的解法:
\]
这里我们令 \(sum(d)=\sum_{p∈ prime ,p|d} \mu({p\over d})\) ,那么这个东西可以在线性筛中预处理出来,具体方法看代码中线性筛处理部分
然后我们考虑数论分块时要能够 O(1) 得到这个 sum 的前缀和,那么我们发现这个函数不是积性函数(况且你能找到一个合适的 g 来和它卷积么),于是不能用杜教筛求解
那么我们自然想到可以处理非积性函数的 min_25 筛了
我们先 min_25 预处理出素数个数的前缀和
然后第二部分中一遍处理 Mu 的信息,一遍处理 Sum ,也就是需要求的答案
那么我们令 \(Sum(n,j)\) 表示 n 以内最小质因子大于等于 \(p_j\) 或是 质数的 sum 函数的前缀和,令 \(Mu(n,j)\) 表示 n 以内最小质因子大于等于 \(p_j\) 的 mu 函数的前缀和,然后转移就是:
\]
\]
最后我们处理出来的所有 \(Sum(n,1)\) 就是数论分块里面要用到的 sum 的前缀和了
学过 min_25 的人都知道为什么这样推导吧...
code
代码... 人傻常数大.jpg
//by Judge
#include<bits/stdc++.h>
#include<unordered_map>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define III __int128
#define ll long long
using namespace std;
const int M=1e7+3;
typedef int arr[M];
typedef ll ARR[M];
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
template<class T>inline T Min(T a,T b){return a<b?a:b;}
template<class T>inline bool cmax(T& a,T b){return a<b?a=b,1:0;}
inline ll read(){ ll x=0,f=1; char c=getchar();
	for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
	for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} char sr[1<<21],z[21];int CCF=-1,Z;
inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
inline void print(III x,char chr='\n'){
    if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;
    while(z[++Z]=x%10+48,x/=10);
    while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
} ll n,m,MX,sq,cnt; III ans; arr v,p,id1,id2;
ARR w,h,mu,sum,S; III Sum[M],Mu[M]; unordered_map<ll,III> ANS;
inline void prep_sum(ll n){ mu[1]=1;
	fp(i,2,n){ if(!v[i]) p[++cnt]=i,mu[i]=-1,sum[i]=1;
		for(int j=1,k;j<=cnt&&p[j]*i<=n;++j){ v[k=i*p[j]]=1;
			if(!(i%p[j])){ sum[k]=mu[i]; break; }
			mu[k]=-mu[i],sum[k]=mu[i]-sum[i];
		} S[i]=sum[i],sum[i]+=sum[i-1];
	}
}
inline int ID(Rg ll x){return x<=sq?id1[x]:id2[n/x];}
inline void prep_num(ll N){ if(N<=MX) return ;
	sq=sqrt(n=N),m=0; int tot=upper_bound(p+1,p+1+cnt,sq)-p-1;
	for(Rg ll l=1;l<=n;l=w[m]+1) w[++m]=n/(n/l),h[m]=w[m]-1,w[m]<=sq?id1[w[m]]=m:id2[n/w[m]]=m;
	fp(j,1,tot) for(Rg int i=m;i&&1ll*p[j]*p[j]<=w[i];--i) h[i]-=h[ID(w[i]/p[j])]-j+1;
	fp(i,1,m) Mu[i]=-h[i],Sum[i]=h[i];
	fd(j,tot,1) for(Rg int i=m,k,kk;i&&1ll*p[j]*p[j]<=w[i];--i) k=ID(w[i]/p[j]),kk=ID(w[k]/p[j]),
		Sum[i]+=Mu[k]-Sum[k]+(j<<1)-(w[kk]>=p[j]?Mu[kk]+j:0)-1,Mu[i]-=Mu[k]+j;
	fp(i,1,m) ANS[w[i]]=Sum[i];
}
inline III GET(Rg ll n){ return n<=MX?sum[n]:ANS[n];}
#define swap(x,y) (x)^=(y)^=(x)^=(y)
int main(){ int T=read(); prep_sum(MX=1e7);
	fp(i,1,T){ Rg ll n=read(),m=read(),bl;
		if(n>m) swap(n,m); ans=0,ANS.clear(),prep_num(n),prep_num(m);
		for(Rg ll l=1,r;l<=n;l=r+1) r=Min(n/(n/l),m/(m/l)),
			ans+=(GET(r)-GET(l-1))*(n/l)*(m/l); print(ans);
	} return Ot(),0;
}
												
											PGCD2 - Primes in GCD Table (Hard)的更多相关文章
- SPOJ PGCD 4491. Primes in GCD Table && BZOJ 2820 YY的GCD (莫比乌斯反演)
		
4491. Primes in GCD Table Problem code: PGCD Johnny has created a table which encodes the results of ...
 - SPOJ4491. Primes in GCD Table(gcd(a,b)=d素数,(1<=a<=n,1<=b<=m))加强版
		
SPOJ4491. Primes in GCD Table Problem code: PGCD Johnny has created a table which encodes the result ...
 - SPOJ - PGCD Primes in GCD Table(莫比乌斯反演)
		
http://www.spoj.com/problems/PGCD/en/ 题意: 给出a,b区间,求该区间内满足gcd(x,y)=质数的个数. 思路: 设f(n)为 gcd(x,y)=p的个数,那么 ...
 - * SPOJ PGCD Primes in GCD Table (需要自己推线性筛函数,好题)
		
题目大意: 给定n,m,求有多少组(a,b) 0<a<=n , 0<b<=m , 使得gcd(a,b)= p , p是一个素数 这里本来利用枚举一个个素数,然后利用莫比乌斯反演 ...
 - SPOJ-PGCD Primes in GCD Table
		
题目链接:https://vjudge.net/problem/SPOJ-PGCD 题目大意: 给定 \(N\) 和 \(M\),求满足 \((1 \le x \le N), (1 \le y \le ...
 - Codeforces Round #323 (Div. 2) C.GCD Table
		
C. GCD Table The GCD table G of size n × n for an array of positive integers a of length n is define ...
 - Codeforces Round #323 (Div. 1)  A. GCD Table
		
A. GCD Table time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
 - Codeforces Round #323 (Div. 2) C. GCD Table 暴力
		
C. GCD Table Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/583/problem/C ...
 - Codeforces Round #323 (Div. 2) C. GCD Table map
		
题目链接:http://codeforces.com/contest/583/problem/C C. GCD Table time limit per test 2 seconds memory l ...
 
随机推荐
- 多数据库有序GUID
			
背景 常见的一种数据库设计是使用连续的整数为做主键,当新的数据插入到数据库时,由数据库自动生成.但这种设计不一定适合所有场景. 随着越来越多的使用Nhibernate.EntityFramework等 ...
 - UOJ143 万圣节的数列 构造
			
传送门 做过这道题,然后这道题告诉你怎么构造数据-- 一种可行的构造方式是:将奇数和偶数分成两半,奇数放在偶数前面,然后除以2,再递归下去处理. 构造的正确性是显然的:如果存在"奇数偶数奇数 ...
 - DIY 空气质量检测表
			
DIY 空气质量检测表 前几天逛淘宝看到有空气颗粒物浓度测量的传感器,直接是 3.3V TTL 电压串口输出的,也不贵,也就 100 多一点.觉得挺好就买了个,这两天自己捣鼓了个小程序,搞了个软件界面 ...
 - Oracle通过Navicat导入表数据与机构,数据无法直接查询,需要加双引号的问题
			
使用navicat 导入表到ORACLE时,总是会遇到虽然表格完整导入到数据库,但是往往查不出来数据,网上提供的解决办法是把查询的列 加上 双引号,或者表名加上双引号,但这解决办法却减慢了编写sql ...
 - [Alpha阶段]第六次Scrum Meeting
			
Scrum Meeting博客目录 [Alpha阶段]第六次Scrum Meeting 基本信息 名称 时间 地点 时长 第六次Scrum Meeting 19/04/10 教2 1层 50min 相 ...
 - Shell命令-文件及目录操作之cp、find
			
文件及目录操作 - cp.find 1.cp:复制文件或目录 cp命令的功能说明 cp命令用于复制文件或目录. cp命令的语法格式 cp [OPTION]... SOURCE... DIRECTORY ...
 - python 基本数据类型以及内置方法
			
一.数字类型 # 一.整型int # ======================================基本使用====================================== ...
 - idea中war和war exploded的区别及修改jsp必须重新启动tomcat才能生效的问题
			
刚开始使用idea,发现工程每次修改JS或者是JSP页面后,并没有生效,每次修改都需要重启一次Tomcat这样的确不方便.我想Idea肯定有设置的方法,不可能有这么不方便的功能存在. 需要在Tomca ...
 - 18.flannel的配置
			
Kubernetes网络通信: (1) 容器间通信:同一个Pod内的多个容器间的通信, lo (2) Pod通信:Pod IP <--> Pod IP (3) Pod与Service通信: ...
 - Django模板语言进阶
			
一.母板 1.什么情况下使用母版 当多个页面的大部分内容都一样的时候,我们可以把相同的部分提取出来,放到一个单独的母版HTML文件中 然后在母版中定义需要被替换的block 例如:母板页面 <! ...