P2257 YY的GCD
2024-08-28 20:34:26
P2257 YY的GCD
题目描述
神犇YY虐完数论后给傻×kAc出了一题
给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对
kAc这种傻×必然不会了,于是向你来请教……
多组输入
输入输出格式
输入格式:
第一行一个整数T 表述数据组数
接下来T行,每行两个正整数,表示N, M
输出格式:
T行,每行一个整数表示第i组数据的结果
输入输出样例
说明
T = 10000
N, M <= 10000000
思路:倍数莫比乌斯反演。
(太长时间没写字了。。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e7 + ;
int t;
//线性筛法求莫比乌斯函数
bool vis[N + ];
int pri[N + ];
int mu[N + ];
ll sum[N];
int f[N];
void mus() {
memset(vis, , sizeof(vis));
memset(f,, sizeof(f));//f[n]=sum(mu[n/p])
mu[] = ;
int tot = ;
for (int i = ; i < N; i++) {
if (!vis[i]) {
pri[tot++] = i;
mu[i] = -;
}
for (int j = ; j < tot && i * pri[j] < N; j++) {
vis[i * pri[j]] = ;
if (i % pri[j] == ) {
mu[i * pri[j]] = ;
break;
}
else mu[i * pri[j]] = -mu[i];
}
}
for(int i=;i<N;i++)
for(int j=;j<tot&&pri[j]*i<N;j++) f[i*pri[j]]+=mu[i];//需要重复更新,不能放在线性筛内部
sum[]=;
for(int i=;i<N;i++) sum[i]=sum[i-]+f[i];
}
int n,m,k;
ll cal(int x,int y){
int ma=min(x,y);
ll res=;
for(int i=,j;i<=ma;i=j+){
j=min(x/(x/i),y/(y/i));
if(j>=ma) j=ma;
res+=1ll*(sum[j]-sum[i-])*(x/i)*(y/i);
}
return res;
} int main() {
mus();
scanf("%d",&t);
for(int i=;i<=t;i++){
scanf("%d%d",&n,&m);
ll ans;
ans=cal(n,m);
printf("%lld\n",ans);
}
return ;
}
最新文章
- invalidate()和postInvalidate() 的区别及使用
- 未备案域名打开国内服务器上的网站(绑定国外空间并判断url后跳转引用)
- Apache Traffic Server(ats)
- qweb
- 如何把一个excel工作薄中N个工作表复制到另一个工作薄中
- hdu 4324 Triangle LOVE(拓扑排序,基础)
- iOS-系统定位功能
- NetBeans工具学习之道:NetBeans的(默认)快捷键
- replication across two data centers
- Shell特殊变量列表
- Leetcode389
- 《Shell脚本学习指南》学习笔记之自定义函数
- Java Reference 源码分析
- JS中的类型识别
- a标签文字选中后的颜色样式更改
- String类详解
- 关于jsp中jstl-core标签循环遍历的使用
- iOS调用第三方导航和线路规划
- 局部变量and全局变量
- oracle compile 编译无效对象
热门文章
- selenium层级定位及鼠标键盘操作
- January 25 2017 Week 4 Wednesday
- nohup命令、setsid命令、Daemon(守护进程)简要梳理
- windows 安装redis并注册服务
- 可变长度参数以及foreach循环原理
- BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】
- how to design Programs 学习笔记
- 在linux命令行中调试在OJ上的c++代码
- halcon 数字转字符串实现循环读取图片
- caffe 学习(2)——基本原理