题意: 

  m*n(1<=m,n<=100000)的森林里,起始点在(1,1),某人从(0,0)点开始看,问能看到多少棵树。

题解:

  求出1~x中的每个数与1~y的数中互质的数的总和。用素数筛筛出1e5以内的素数。在用这些素数筛出1e5以内每个数的素数因子。最后通过容斥算出与每个数互质的个数。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 1e5+;
int t;
int x, y;
int len;
int pnum;
int p[maxn];
bool e[maxn];
ll res, ans;
vector<int> g[maxn];
void prime() {
e[] = e[] = ; pnum = ;
for(int i = ; i < maxn; i++) {
if(e[i]==) p[++pnum] = i;
for(int j = ; j<=pnum && p[j]*i<maxn; j++) {
e[p[j]*i] = ;
if(i%p[j]==) break;
}
}
}
int gcd(int x, int y) {
return y==?x:gcd(y, x%y);
}
int lcm(int x, int y) {
return x/gcd(x, y)*y;
}
void dfs(int cur, int tol, int sum, int id) {
if(cur >= len) return ;
int p = lcm(g[id][cur], sum);
if(tol&) res -= y/p;
else res += y/p;
dfs(cur+, tol+, p, id);
dfs(cur+, tol, sum, id);
}
int main() {
prime();
for(int i = ; i <= pnum; i++) {
int cnt = ;
while(cnt*p[i] <= ) {
g[cnt*p[i]].push_back(p[i]);
cnt++;
}
}
scanf("%d", &t);
while(t--) {
scanf("%d%d", &x, &y);
if(x > y) swap(x, y);
ans = y;
for(int i = ; i <= x; i++) {
res = ;
len = g[i].size();
dfs(, , , i);
ans += y-res;
}
printf("%lld\n", ans);
}
}

最新文章

  1. tracert与pathping
  2. cf 731f
  3. NuGet多个项目依赖的公共组件如何打包
  4. HTML学习笔记——选择器
  5. 泊松回归(Poisson Regression)
  6. map 后 PE 蓝屏原因专题讨论(e820cycles参数)
  7. ylbtech-Unitity-CS:Generics
  8. Direct2D 简介
  9. php 二维码生成类
  10. C语言顺序栈实现
  11. 8086 CPU 寻址方式
  12. POJ 1159 - Palindrome 优化空间LCS
  13. C# 6.0:Auto-Property initializer
  14. idea实现热部署并且开启自动编译
  15. Deep Dive into Spark SQL’s Catalyst Optimizer(中英双语)
  16. 多项式函数插值:多项式形式函数求值的Horner嵌套算法
  17. 笔记三:python乱码深度剖析一
  18. DICOM 协议学习笔记之 What is DICOM
  19. JIT IR,C2
  20. web 安全问题(一):CSRF 攻击

热门文章

  1. spring-IOC底层机制
  2. JavaScript数组常用的方法
  3. stat.h头文件,轻松获取文件属性
  4. python__基础 : 异常处理与自定义异常
  5. 【jQuery】input框输入手机号自动填充空格
  6. 虚拟机桥接模式下多台Ubuntu16.04系统互相连接
  7. python web框架的介绍
  8. 寻找物体的凸包 opencv
  9. Nginx模块详解
  10. 把实体bean对象转换成DBObject工具类