hdu2841Visible Trees 容斥原理

//给定一个n*m的方格,农场主从(0 , 0 )开始看 , 只能看到

//一条直线上的第一个格子,问农场主能看到几个格子

//对于任意的坐标(x,y) ,与其在同一条直线上的坐标有(k*x , k*y)

//故而可以枚举所有的x,找其在(1,m)有多少个互质的数

#include<cstring>

#include<iostream>

#include<cstdio>

#include<vector>

using namespace std ;

typedef __int64 ll ;

const int maxn = 100010 ;

int isp[maxn] ;

vector<int> vec[maxn] ;

void set()

{

memset(isp , 0 , sizeof(isp)) ;

for(int i = 2;i < maxn;i+=2)

vec[i].push_back(2) ;

for(int i = 3;i < maxn;i+=2)

{

if(isp[i])continue ;

for(int j = i;j < maxn;j+=i)

{

isp[j] = 1;

vec[j].push_back(i) ;

}

}

}

int dfs(int pos , int x , int num)

{

int ans = 0 ;

for(int i = pos ;i < vec[x].size() ;i++)

ans += num/vec[x][i] - dfs(i+1 , x , num/vec[x][i]) ;

return ans ;

}

int main()

{

int n , m ;

set() ;

int T;scanf("%d" ,&T) ;

while(T--)

{

scanf("%d%d" ,  &n, &m) ;

ll ans = m;

for(int i = 2;i <= n;i++)

ans +=( m - dfs(0 , i , m)) ;

printf("%I64d\n" , ans) ;

}

return  0 ;

}

时间: 2024-10-14 20:09:10

hdu2841Visible Trees 容斥原理的相关文章

hdu 2841 Visible Trees 容斥原理

Visible Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description There are many trees forming a m * n grid, the grid starts from (1,1). Farmer Sherlock is standing at (0,0) point. He wonders how ma

HDU2841 Visible Trees (容斥原理)

主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2841 题意: 一个人在(0,0)点,然后前面有一个m*n的格子 ,每一个格子的节点上有一棵树.问这个人站在原地能看到多少棵树 假设两棵树在一条直线上那么仅仅能看到最前面的一棵树. 分析: 假设一个数的坐标为(a,b).那么坐标为(a*k,b*k)的都不能看见.假设a,b有公因子c那么我们肯定仅仅能看到(a/c,b/c). 因此我们得出结论,能看到的树的横纵坐标一定互质. 那么我们就能够把问题转化为,

hdu 2841 Visible Trees【容斥原理】

Visible Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1602    Accepted Submission(s): 661 Problem Description There are many trees forming a m * n grid, the grid starts from (1,1). Farm

hdu 4135 Co-prime +hdu 2841 Visible Trees(容斥原理)

Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2263    Accepted Submission(s): 847 Problem Description Given a number N, you are asked to count the number of integers between A and B

[思维+容斥原理] hdu 2841 Visible Trees

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2841 Visible Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1337    Accepted Submission(s): 552 Problem Description There are many trees f

HDU 2841 Visible Trees 数论+容斥原理

容斥原理 题意:给n*m的矩阵有点,左下角的点为(1,1),右上角的点(n,m),(其实转回来也是没影响的即m*n),一个人站在(0,0)看这些点,在一条直线的视线上,它只能看到最前面的那个点,后面的点将会被档住他看不到,问你,这个人一共能看到多少个点. 这个问题只要画一下图不难发现,如果一个点(x,y),x和y有非1的公约数z,那么他们其实可以一起缩小为(x/z,y/z),试着把这两个点和(0,0)连线,发现他们其实是同一条直线,而(x/z,y/z) 在前面,所以其实(x,y)被挡住了看不到的

HDU2841 Visible Trees(容斥原理)

题目..大概就是有个m*n个点的矩形从(1,1)到(m,n),问从(0,0)出发直线看过去最多能看到几个点. 如果(0,0)->(x,y)和(0,0)->(x',y')两个向量平行,那后面的那个点就看不到了. 因此给出一个点(x,y),判断它能否被看到,就是是否能找到一个大于1的k,使k|x且k|y. 这样,问题就能转变为有几个点的x.y找不到公约数,即有几对x.y,满足x和y互质. 可以通过枚举x,看有几个y与其互质累加.这样问题就又变成,区间有几个数与某个数互质,经典的容斥问题HDU413

HDU 2841-Visible Trees(容斥原理)

题目链接:传送门 题意:有一个n*m的矩阵上布满了树(矩阵从(1,1)开始),现在有一个农夫站在(0,0)点,问农夫可以看到多少棵树,其中如果这些树在一条线上那么只能看到最前面的那棵树,这个一开始看到确实蒙了..看了题解其实是挺简单的.首先考虑只能看到一条线上最前面的那棵树这个条件,对于坐标 比如 (2,3)(4,6)(6,9)..等 这些坐标是在一条直线上的 可以看出其除了(2,3) 其他的都是由(2,3)的x坐标*k y坐标*k 得到的,  拓展出来就是对于 任意坐标 (x,y) 令a=x/

hdoj 2841Visible Trees(容斥原理)

题意:m*n的格点上有m*n棵树,从(0,0)点可以看到多少棵树 假设x与1到m有num[x]个数互质,即1到m中与x有非1的公约数的个数 为m-num[x], 最后结果就是n*m-(num[1]+...num[n]) #include<stdio.h> #include<vector> #include<string.h> #include<iostream> using namespace std; const int N=100000+10; vect