zoukankan      html  css  js  c++  java
  • 【BZOJ3518】点组计数 [欧拉函数]

    点组计数

    Time Limit: 20 Sec  Memory Limit: 128 MB
    [Submit][Status][Discuss]

    Description

        平面上摆放着一个n*m的点阵(下图所示是一个3*4的点阵)。Curimit想知道有多少三点组(a,b,c)满足以a,b,c三点共线。这里a,b,c是不同的3个点,其顺序无关紧要。(即(a,b,c)和(b,c,a)被认为是相同的)。由于答案很大,故你只需要输出答案对1,000,000,007的余数就可以了。

    Input

      有且仅有一行,两个用空格隔开的整数n和m。

    Output

      有且仅有一行,一个整数,表示三点组的数目对1,000,000,007的余数。(1,000。000。007是质数)

    Sample Input

      3 4

    Sample Output

      2 0

    HINT

      对于100%的数据,1< =N.m< =50000

    Main idea

      给定一个点阵,问有多少组三点共线。

    Solution

      其实我也不知道原式怎么来的,我可能只会推式子啊?QAQ

    Code

     1 #include<iostream>  
     2 #include<string>  
     3 #include<algorithm>  
     4 #include<cstdio>  
     5 #include<cstring>  
     6 #include<cstdlib>  
     7 #include<cmath>
     8 using namespace std; 
     9 typedef long long s64;
    10     
    11 const int ONE = 50005;
    12 const int MOD = 1000000007;
    13 const int Ny6 = 166666668;
    14 
    15 int T;
    16 int n,m;
    17 bool isp[ONE];
    18 int prime[ONE],p_num;
    19 int phi[ONE];
    20 s64 Ans;
    21    
    22 int get() 
    23 {
    24         int res=1,Q=1;  char c;
    25         while( (c=getchar())<48 || c>57)
    26         if(c=='-')Q=-1;
    27         if(Q) res=c-48; 
    28         while((c=getchar())>=48 && c<=57) 
    29         res=res*10+c-48; 
    30         return res*Q; 
    31 }
    32 
    33 void Getphi(int MaxN)
    34 {
    35         phi[1] = 1;
    36         for(int i=2; i<=MaxN; i++)
    37         {
    38             if(!isp[i])
    39                 prime[++p_num] = i, phi[i] = i - 1;
    40             for(int j=1; j<=p_num, i*prime[j]<=MaxN; j++)
    41             {
    42                 isp[i * prime[j]] = 1;
    43                 if(i % prime[j] == 0)
    44                 {
    45                     phi[i * prime[j]] = (s64)phi[i] * prime[j] % MOD;
    46                     break;
    47                 }
    48                 phi[i * prime[j]] = (s64)phi[i] * phi[prime[j]] % MOD;
    49             }
    50         }
    51 }
    52 
    53 s64 Get(int a,int b,int num) {return (s64)(a+b) * num / 2 %MOD; }
    54 s64 Sum(int n,int m) {return ((s64)n*(n-1)/2%MOD) * ((s64)m*(m-1)/2%MOD) % MOD;}
    55 
    56 int C(int n)
    57 {
    58         int res = (s64)n * (n-1) % MOD * (n-2) % MOD;
    59         return (s64) res * Ny6 % MOD;
    60 }
    61 
    62 int main()
    63 {
    64         Getphi(ONE-1);
    65         n=get();    m=get();
    66         if(n > m) swap(n,m);
    67         for(int d=1; d<=n; d++)
    68         {
    69             Ans += phi[d] * Get(n-d,n-(n/d)*d,n/d) % MOD *Get(m-d,m-(m/d)*d,m/d) % MOD;
    70             Ans %= MOD;
    71         }
    72         
    73         Ans = (Ans - Sum(n,m) + MOD) % MOD;
    74         Ans = Ans*2%MOD + (s64)C(n)*m%MOD + (s64)C(m)*n%MOD;
    75         Ans %= MOD;
    76         
    77         printf("%lld",Ans);
    78 }
    View Code

     

  • 相关阅读:
    伪静态
    query 文件提交 +php后台入库
    PHP实现URL长连接转短连接方法
    通过经纬度获取所属城市信息
    PHP 学习之路1
    Linux云服务器安装tomcat
    linux下svn服务器搭建步骤
    HttpServletrequest 与HttpServletResponse总结
    HTML5基础
    Ajax相关总结
  • 原文地址:https://www.cnblogs.com/BearChild/p/6679382.html
Copyright © 2011-2022 走看看