题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4483

题意:给出一个(n+1)*(n+1)的格子。在这个格子中存在多少个三角形?

思路:反着想,所有情况减去不是三角形的。下面计算不是三角形的。

(1)我们用C(n,m)表示组合数。考虑共线,一共有C((n+1)*(n+1),3)种情况。然后,要减去共线的情况。首先,三个点在同一行或者同一列,这种情况有2*(n+1)*C(n+1,3);最后就是斜着共线的情况;

(2)对于斜着共线的情况,我们可以枚举两个端点,然后看这两个端点之间有多少个点。我们发现,我们枚举两个端点时其实就是枚举一个小矩形的两个相对的顶点,我们知道,设矩形长宽为x,y,那么矩形对角线上有Gcd(x,y)+1个点,除去两个端点,中间有Gcd(x,y)-1个点。所以此次枚举需要减去的三角形个数为(Gcd(x,y)-1)*2。为啥乘以2呢?因为矩形的另外一个对角线也是相同的。接着,我们发现,这样的三角形一共有(n+1-x)*(n+1-y)个,所以枚举x、y时需要减去的总数为:(Gcd(x,y)-1)*(n+1-x)*(n+1-y)*2,因此,我们可以这样计算斜线共线的个数:

这个复杂度是O(n^2)的。下面我们优化这个计算过程。我们现在直接枚举i和j的Gcd值,设为k,即Gcd(i,j)=k,那么Gcd(i/k,j/k)=1,令a=i/k,b=j/k,那么对于当前的k我们首先看有多少组(x,y)满足Gcd(x,y)=k,也就是多少组 (x,y)满足gcd(x,y)=1,x<=a,y<=b,由于对称性,我们不妨设a<=b,那么此时(x,y)的对数就是:

其中,那个1表示(x,y)=(1,1),后面的phi表示欧拉函数,乘以2是因为x和y的对称性,我们此时是假设的a<=b,也即x<y(注意除了开始的(1,1)后面不会有x=y 的,因为Gcd(x,y)=1),x和y是可以交换位置的。这样对于某个k我们就求出了有多少对(x,y)满足Gcd(x,y)=k。接着,我们看上面那个式子:

因为满足Gcd(x,y)=k的(x,y)的对数已经计算出来。而上面的式子中是指对于其中的某一对(x,y)计算的,我们令式子中(n+1)^2、(n+1)*K、k^2的系数分别为A、B、C,那么有:

其中phi容易计算。那么B和C怎么计算呢?对于n,若Gcd(n,m)=1,那么Gcd(n,n-m)=1。也就是与n互质的数字是成对出现的,而且和为n。所以[1,n]中与n互质的数字之和为:phi[n]/2*n。这样,就能使用phi计算出B和C了。

i64 A[N],B[N],C[N],phi[N];

void init()
{
    A[1]=C[1]=1; B[1]=2;
    int i,j;
    phi[1]=1;
    for(i=2;i<N;i++) if(!phi[i])
    {
        for(j=i;j<N;j+=i)
        {
            if(!phi[j]) phi[j]=j;
            phi[j]-=phi[j]/i;
        }
    }
    for(i=2;i<N;i++)
    {
        A[i]=(A[i-1]+phi[i]*2)%mod;
        B[i]=(B[i-1]+phi[i]*i*3)%mod;
        C[i]=(C[i-1]+phi[i]*i%mod*i)%mod;
    }
}

i64 n;

int C3(i64 x)
{
    if(x<=2) return 0;
    i64 a=(x-1)%mod,b=(x-2)%mod,c=166666668;
    return x%mod*a%mod*b%mod*c%mod;
}

i64 M(i64 x,i64 y,i64 z)
{
    return x*y%mod*z%mod;
}

int main()
{
    init();
    rush()
    {
        RD(n);
        i64 ans=C3((n+1)*(n+1))-2*(n+1)*C3(n+1)%mod;
        i64 temp=0;
        i64 i,k;
        for(i=2;i<=n;i++)
        {
            k=n/i;
            temp+=(i-1)*(M(n+1,n+1,A[k])-M(n+1,i,B[k])+M(i,i,C[k]))%mod;
            temp%=mod;
        }
        ans-=temp*2;
        ans=(ans%mod+mod)%mod;
        PR(ans);
    }
    return 0;
}

HDU 4483 Lattice triangle(欧拉函数)的更多相关文章

  1. HDU 1695 GCD (欧拉函数+容斥原理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  2. HDU 5430 Reflect(欧拉函数)

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=5430 从镜面材质的圆上一点发出一道光线反射NNN次后首次回到起点. 问本质不同的发射的方案数. 输入描述 ...

  3. hdu 5279 Reflect phi 欧拉函数

    Reflect Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contests/contest_chi ...

  4. HDU 1695 GCD(欧拉函数+容斥原理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:x位于区间[a, b],y位于区间[c, d],求满足GCD(x, y) = k的(x, ...

  5. POJ3090 Visible Lattice Points 欧拉函数

    欧拉函数裸题,直接欧拉函数值乘二加一就行了.具体证明略,反正很简单. 题干: Description A lattice point (x, y) in the first quadrant (x a ...

  6. HDU 1787 GCD Again(欧拉函数,水题)

    GCD Again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  7. hdu 3501 Calculation 2 (欧拉函数)

    题目 题意:求小于n并且 和n不互质的数的总和. 思路:求小于n并且与n互质的数的和为:n*phi[n]/2 . 若a和n互质,n-a必定也和n互质(a<n).也就是说num必定为偶数.其中互质 ...

  8. hdu 1695 GCD(欧拉函数+容斥)

    Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD( ...

  9. hdu 2814 快速求欧拉函数

    /** 大意: 求[a,b] 之间 phi(a) + phi(a+1)...+ phi(b): 思路: 快速求欧拉函数 **/ #include <iostream> #include & ...

随机推荐

  1. CustomEditor 自定义预览窗

    using UnityEngine; using System.Collections; public class MyTextureView : MonoBehaviour { public Tex ...

  2. [WinForm]- 设置DataGridView单元格内根据不同值显示图片

    首先设置要显示图片的列 DataGridViewImageColumn status = new DataGridViewImageColumn(); status.DisplayIndex = ; ...

  3. c#之委托和事件的区别

    1.什么是委托,这里就不做介绍了,如果想了解可以查看博客:http://www.cnblogs.com/xiaoxiaogogo/p/3571494.html 下面开始对事件进行介绍 1.定义事件以及 ...

  4. Linux课本第一二章

    一.第一章:Linux内核简介 1.操作系统和内核:操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分,包括内核.设备驱动程序.启动引导程序.命令行shall等. 内核就是操作系统的核心, ...

  5. asp.net 中插入数据到access

    这样报语法错误: insert into Menu_wx(userid,menutype,MenuID,menuname,MenuTitle,Url,Key,OrderValue,State) val ...

  6. BZOJ 1143: [CTSC2008]祭祀river 最大独立集

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1143 题解: 给你一个DAG,求最大的顶点集,使得任意两个顶点之间不可达. 把每个顶点v ...

  7. [转载]C++ CString与int 互转

    1.CString 转 int      CString strtemp = "100";    int  intResult;    intResult= atoi(strtem ...

  8. FolderBrowserDialog 成员

    http://msdn.microsoft.com/zh-cn/library/system.windows.forms.folderbrowserdialog_members(v=vs.80).as ...

  9. 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子

    原地址:http://www.cnblogs.com/xuling/archive/2013/03/04/2943154.html 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西 ...

  10. linux服务器重启服务命令说明文档

    (前提是电脑上面已经安装好了ssh软件~!)输入ip,用户名,端口(默认22) 输入密码,登陆成功之后, 转入到/usr/local/tomcat/bin 目录,输入命令行: [root@yangch ...