标签:des style blog class code java
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2841
2 1 1 2 3
1 5
题目意思:
给n*m的矩阵(从(1,1)开始编号)格子,每个格子有一棵树,人站在(0,0)的位置,求可以看到多少棵树。同一直线上的树只能看到最靠近人的那颗。
解题思路:
容斥原理
假设当前格子坐标为(i,j)如果记a=i/gcd(i,j),b=j/gcd(i,j) 显然人与该格子的连线上的格子坐标(x,y)满足x=i+(-)k*a y=j+(-)k*b,显然最靠近人的那棵树坐标为(a,b),显然gcd(a,b)=1
所以可以推导出人看的见的格子坐标满足横纵坐标互质,所以问题就转化为在(1~n,1~m)间满足横纵坐标互质的坐标有多少个。
所以可以在1~n范围内枚举i,然后容斥原理求出在1~m间与i互质的个数。
代码:
//#include<CSpreadSheet.h> #include<iostream> #include<cmath> #include<cstdio> #include<sstream> #include<cstdlib> #include<string> #include<string.h> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<set> #include<stack> #include<list> #include<queue> #include<ctime> #include<bitset> #include<cmath> #define eps 1e-6 #define INF 0x3f3f3f3f #define PI acos(-1.0) #define ll __int64 #define LL long long #define lson l,m,(rt<<1) #define rson m+1,r,(rt<<1)|1 #define M 1000000007 //#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; #define N 1000 bool isp[N+10]; int pri[N+10],cnt,pp[N+10],cnt0,n,m; ll ans; void init() //筛选出1~1000内的质因数 { cnt=0; for(int i=1;i<=N;i++) isp[i]=true; for(int i=2;i<=N;i++) { if(isp[i]) { pri[++cnt]=i; for(int j=i*2;j<=N;j+=i) isp[j]=false; } } //printf("cnt:%d\n",cnt); } void cal(int cur) //将cur分解质因数 { cnt0=0; for(int i=1;pri[i]*pri[i]<=cur;i++) { if(cur%pri[i]==0) { pp[++cnt0]=pri[i]; while(!(cur%pri[i])) cur/=pri[i]; } } if(cur!=1) pp[++cnt0]=cur; } void dfs(int hav,int cur,int num) //容斥原理求与i互质的个数 { if(hav>m||cur>cnt0) return ; for(int i=cur;i<=cnt0;i++) { int temp=hav*pp[i]; if(num&1) ans-=m/temp; else ans+=m/temp; dfs(temp,i+1,num+1); } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); init(); int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); ans=m; for(int i=2;i<=n;i++) { cal(i); ans+=m; for(int j=1;j<=cnt0;j++) { ans-=m/pp[j]; dfs(pp[j],j+1,2); } } printf("%I64d\n",ans); } return 0; }
[思维+容斥原理] hdu 2841 Visible Trees,布布扣,bubuko.com
[思维+容斥原理] hdu 2841 Visible Trees
标签:des style blog class code java
原文地址:http://blog.csdn.net/cc_again/article/details/25245509