博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】2301: [HAOI2011]Problem b
阅读量:6656 次
发布时间:2019-06-25

本文共 2132 字,大约阅读时间需要 7 分钟。

【题意】于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数。n,a,b,c,d,k<=50000。

【算法】数论(莫比乌斯反演)

【题解】差分转化为询问有多少数对(x,y)满足x,y互素,1<=x<=n/k,1<=y<=m/k。

 令f[x]表示gcd(a,b)=x的数对个数,F[x]表示满足 x | gcd(a,b) 的数对个数,则F[x]=Σx|df(d)。

易得F[x]=(n/x)*(m/x),那么根据莫比乌斯反演定理,f(x)=Σx|dμ(d/n)*F(d)=Σx|dμ(d/n)*(n/d)*(m/d)。

当x=1时,f(1)=Σμ(d)*(n/d)*(m/d),d=1~min(n,m),单次询问复杂度O(n)。

继续优化,n/d至多只有2*√n个取值,只要枚举这些取值后运用μ的前缀和(预处理)快速计算。

具体方法是:当前取值为n/i时,最小为i,最大为pos=n/(n/i),这m/(m/i)取min即可。

复杂度O(n√n)。

#include
#include
#define ll long longusing namespace std;const int maxn=50010;int miu[maxn],prime[maxn],tot,s[maxn],n;bool mark[maxn];void pre(int n){ miu[1]=1; for(int i=2;i<=n;i++){ if(!mark[i])miu[i]=-1,prime[++tot]=i; for(int j=1;j<=tot&&i*prime[j]<=n;j++){ mark[i*prime[j]]=1; miu[i*prime[j]]=-miu[i]; if(i%prime[j]==0){miu[i*prime[j]]=0;break;} } } for(int i=1;i<=n;i++)s[i]=s[i-1]+miu[i];}ll solve(int n,int m){ ll ans=0;int pos=0; for(int i=1;i<=min(n,m);i=pos+1){ pos=min(n/(n/i),m/(m/i)); ans+=1ll*(s[pos]-s[i-1])*(n/i)*(m/i); } return ans;} int main(){ scanf("%d",&n); pre(50000); for(int i=1;i<=n;i++){ int a,b,c,d,k; scanf("%d%d%d%d%d",&a,&b,&c,&d,&k); a--;c--;a/=k;b/=k;c/=k;d/=k; printf("%lld\n",solve(b,d)-solve(b,c)-solve(a,d)+solve(a,c)); } return 0;}
View Code

尝试从套路的角度来推导ans=Σx|dμ(d/n)*(n/d)*(m/d)

★当x=1时,Σd|xμ(x)=1。所以gcd(a,b)=1等价于Σd|a&&d|bμ(d)。——①

$$ans=\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=k]$$

(i,j)=k等价于(i/k,j/k)=1可以得到:——②

$$ans=\sum_{i=1}^{\frac{n}{k}}\sum_{j=1}^{\frac{m}{k}}[gcd(i,j)=1]$$

下一步代入经典gcd转μ,得到:

$$ans=\sum_{i=1}^{\frac{n}{k}}\sum_{j=1}^{\frac{m}{k}}\sum_{d|i\cap d|j}\mu (d)$$

套路化地改为枚举gcd,得到:——③

$$ans=\sum_{d=1}^{min(\frac{n}{k},\frac{m}{k})}\mu (d)\sum_{i=1}^{\frac{n}{k}}\sum_{j=1}^{\frac{m}{k}}[d|i\cap d|j]$$

最后部分满足条件的数对都可以除以d,就可以压缩上标直接计算了,即:——④

$$ans=\sum_{d=1}^{min(\frac{n}{k},\frac{m}{k})}\mu (d)\left \lfloor \frac{n}{kd} \right \rfloor\left \lfloor \frac{m}{kd} \right \rfloor$$

 

转载于:https://www.cnblogs.com/onioncyc/p/8269349.html

你可能感兴趣的文章
【天池直播】天池线上赛自定义函数实践
查看>>
普通企业站的seo优化策略
查看>>
如何使用VMware ThinApp一步步虚拟化应用
查看>>
WebHook 自动化部署和运维工具 git-webhook
查看>>
R语言中的哪些命令或者包让你相见恨晚
查看>>
美团Apache Kylin精确去重指标优化历程
查看>>
如何在Linux中不输入密码运行sudo命令
查看>>
美国如何保护关键信息基础设施
查看>>
《 自动化测试最佳实践:来自全球的经典自动化测试案例解析》一一第2章 终极数据库自动化...
查看>>
瑞银集团:金融科技服务在这一领域最具威胁
查看>>
加拿大可再生能源发电已达66%的比例
查看>>
天合光能组件出货引领印度太阳能市场 2016年市场份额达25.7%
查看>>
再战“6.18”销售额榜首,韩都衣舍究竟“凭什么!”
查看>>
看看淘宝的工程师如何评论12306
查看>>
Linux之:最常用的20条命令
查看>>
收藏|Java程序员必看的几本基础书籍和常用工具
查看>>
基于Docker快速搭建Gitlab与Gitlab CI/CD服务
查看>>
黄秀杰教程之--Node使用小程序模板消息
查看>>
React Hooks
查看>>
关于抢购秒杀的实现思路与事例代码
查看>>