zoukankan      html  css  js  c++  java
  • P3166 [CQOI2014]数三角形

    传送门

    直接求还要考虑各种不合法情况,不好计数

    很容易想到容斥

    把所有可能减去不合法的情况剩下的就是合法情况

    那么我们只要任取不同的三点就是所有可能,不合法情况就是三点共线

    对于两点 $(x_1,y_1) , (x_2,y_2)$ ,它们之间有 $gcd(left | x_1-x_2 ight |,left | y_1-y_2 ight |)-1$ 个交点

    证明?因为第三点C如果在两点A,B间的线上

    那么$frac{left | x_A-x_C ight |}{ left | y_A-y_C ight |}=frac{left | x_A-x_B ight |}{ left | y_A-y_B ight |}$

    因为 $x_C,y_C$ 为整数且在A,B之间,所以只有 $gcd(left | x_A-x_B ight |,left | y_A-y_B ight |)-1$ 个位置可取

    自己画个图感性理解一下就好了

    所以一个直接的思路就是枚举所有两个点A,B,算出C的数量

    但是可以发现有很多线段AB其实本质是一样的,只是位置不同,我们可以通过平移来得到

    把点A固定在原点上,然后枚举B,这样可以得到所有本质不同的线段

    然后考虑有多少种平移方案

    设 B 坐标为 (X,Y),那么线段可以向上平移最多 N-Y 个单位,向右平移最多 M-X 个单位

    因为可以平移 0 个单位,所以共有 (N-Y+1)(M-X+1) 种方案

    因为AB斜率可以为负,所以要把之前求出来的方案数再乘 2 

    在坐标系中任选3点的方案数为 $C_{(N+1)(M+1)}^{3}$

    别忘了减去三点横坐标相同或纵坐标相同的情况:

    对于每条横线,都有 $C_{M+1}^{3}$种方案,共 N 条横线

    对于每条纵线,也是一样,为 $M*C_{N+1}^{3}$

    别忘了开 long long

    代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    inline int read()
    {
        int x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
        while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
        return x*f;
    }
    int n,m,t;
    ll ans;
    int gcd(int a,int b) { return b ? gcd(b,a%b) : a; }
    int main()
    {
        n=read()+1; m=read()+1;
        t=n*m;
        ans=1ll*t*(t-1)*(t-2)/(1*2*3) - 1ll* m* n*(n-1)*(n-2)/(1*2*3) - 1ll* n* m*(m-1)*(m-2)/(1*2*3);
        //总方案数 - 纵线不合法方案 - 横线不合法方案
        for(int i=1;i<n;i++)//枚举点B纵坐标
            for(int j=1;j<m;j++)//横坐标
                ans-=1ll*(n-i)*(m-j)*(gcd(i,j)-1)*2;//减去斜线不合法方案数
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    block的是发送信号的线程,又不是处理槽函数的线程
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/9914122.html
Copyright © 2011-2022 走看看