zoukankan      html  css  js  c++  java
  • HDU 2841 Visible Trees(容斥定理)

    Visible Trees

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1951    Accepted Submission(s): 792


    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 many trees he can see.

    If two trees and Sherlock are in one line, Farmer Sherlock can only see the tree nearest to him.
     

    Input
    The first line contains one integer t, represents the number of test cases. Then there are multiple test cases. For each test case there is one line containing two integers m and n(1 ≤ m, n ≤ 100000)
     

    Output
    For each test case output one line represents the number of trees Farmer Sherlock can see.
     

    Sample Input
    2 1 1 2 3
     

    Sample Output
    1 5
     

    Source
     



             题意:有一个n*m的矩阵。左下角坐标为(1,1),右上角坐标为(n,m);你如今的位置的坐标是(0,0),输出如今你能看到几个点.
             思路:你将矩阵细致研究一下会发现假设两个点A(x1,y1),B(x2,y2)假设x2,y2有一个公约数k,使得x2/k == x1 && y2/k == y1 这种话就两个点就会形成一个线段y=kx。正好(0,0)在这条线段中。故在这条线段上的矩阵上的点就仅仅能看到一个。

    所以我们就得出结论假设坐标(x,y)中x,y互质。那么就能过被看到,假设我们将矩阵的一边固定住。假设是n,那么题意就转化成求1--m与区间[1,n]求互质的个数的题了,这种话就是一个非常easy的容斥定理的问题了,详细看代码吧。






    #include<iostream>
    #include<algorithm>
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<math.h>
    #include<vector>
    #include<queue>
    #include<stack>
    #include<map>
    
    #define N 1100
    
    using namespace std;
    
    int n,m,k;
    int prime[N],num[N];
    int t;
    
    __int64 IEP(int pn){   /// [n,m]区间求与k互质的个数
        int pt = 0;
        __int64 s = 0;
        num[pt++] = -1;
        for(int i=0;i<t;i++){
            int l = pt;
            for(int j=0;j<l;j++){
                num[pt++] = num[j]*prime[i]*(-1);
            }
        }
        for(int i=1;i<pt;i++){
            s += pn/num[i];
        }
        return s;
    }
    
    int main(){
        int T;
        scanf("%d",&T);
        while(T--){
            scanf("%d%d",&n,&m);
            __int64 sum = 0;
            for(int i=1;i<=n;i++){
                memset(prime,0,sizeof(prime));
                memset(num,0,sizeof(num));
                int pk = sqrt(i);
                int nn = i;
                t = 0;
                for(int j=2;j<=pk;j++){
                    if(nn%j == 0){
                        prime[t++] = j;
                        while(nn%j == 0){
                            nn = nn / j;
                        }
                    }
                }
                if(nn!=1){
                    prime[t++] = nn;
                }
                sum += m - IEP(m);
            }
            printf("%I64d
    ",sum);
        }
        return 0;
    }


  • 相关阅读:
    关于Web登陆安全
    HttpWebRequest 忽略证书
    C# 语音识别(文字to语音、语音to文字)
    Microsoft Visual Studio 11(ISO、Web Installer)、.NET Framework 4.5 等下载地址
    ubuntu硬盘安装及启动,menu.lst
    下载虾米音乐的歌词
    sublime text在linux下一键编译c和c++程序的配置文件
    foobar2000专辑封面混乱解决方法
    qt creator纯C或C++项目在windows下的命令行中文乱码解决
    婚姻就是嫁给习惯和性格(转)
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7017786.html
Copyright © 2011-2022 走看看