zoukankan      html  css  js  c++  java
  • HDU 5738 Eureka

    知道怎么计数很简单,但知道怎么想出简单的计数很难。

    固定两个点算集合的个数,这样既好写,又不用记纵截距,map里的东西又少。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<map>
    #define maxn 1050
    #define mod 1000000007
    using namespace std;
    int n,ans=0,tab[maxn],x[maxn],y[maxn],tot=0;
    struct point
    {
        int x,y;
        point (int x,int y):x(x),y(y) {}
        point () {}
    }p[maxn];
    map <pair<int,int>,int> mp;
    int gcd(int a,int b)
    {
        if (!b) return a;
        return gcd(b,a%b);
    }
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
            scanf("%d%d",&x[i],&y[i]);
        tab[0]=1;for (int i=1;i<=1000;i++) tab[i]=tab[i-1]*2%mod;
        for (int i=1;i<=n;i++)
        {
            tot=0;int cls=0;
            for (int j=i+1;j<=n;j++)
            {
                if ((x[j]==x[i]) && (y[j]==y[i])) cls++;
                else p[++tot]=point(x[j]-x[i],y[j]-y[i]);
            }
            mp.clear();
            for (int j=1;j<=tot;j++)
            {
                int nx,ny,d;
                nx=p[j].x;ny=p[j].y;
                if ((nx<0) || ((nx==0) && (ny<0))) nx=-nx,ny=-ny;
                d=gcd(nx,ny);nx/=d;ny/=d;
                ans+=tab[mp[make_pair(nx,ny)]+cls];if (ans>=mod) ans-=mod;
                mp[make_pair(nx,ny)]++;
            }
            ans+=tab[cls]-1;if (ans>=mod) ans-=mod;
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    SDN第四次上机作业
    SDN第四次作业
    SDN第三次上机作业
    SDN第三次作业
    SDN第二次上机作业
    SDN第二次作业
    个人作业——软件产品案例分析(待更)
    软工 实验三 需求分析(沈樟伟组)
    个人博客二:需求分析
    微软小娜APP的案例分析
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/6283224.html
Copyright © 2011-2022 走看看