题目链接: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. SVN学习

    一.SVN在线安装(Eclipse) 步骤1: 步骤2 其中http://subclipse.tigris.org/update_1.10.x是最新版本的SVN插件的下载站点[subclipse是Ec ...

  2. MITK Tutorial (三)

    Step 2: Use the template with the plugins to read a image 在exampleplugin插件中QmitkAwesomeView.cpp中添加头文 ...

  3. android 设置叠加父级响应点击事件

    最近做android项目时,需要让button的后面的relatelayout可以点击,但是虽然把button设置成了focusable="false",relatelayout中 ...

  4. TS流格式(转)

    一 从TS流开始 数字电视机顶盒接收到的是一段段的码流,我们称之为TS(Transport Stream,传输流),每个TS流都携带一些信息,如Video.Audio以及我们需要学习的PAT.PMT等 ...

  5. tomcat内存溢出,设置

    tomcat/bin/catalina.bat里找到echo Using CATALINA_BASE:   "%CATALINA_BASE%" ,在上方设置:    set JAV ...

  6. 2693: jzptab - BZOJ

    Description Input 一个正整数T表示数据组数接下来T行 每行两个正整数 表示N.MOutput T行 每行一个整数 表示第i组数据的结果Sample Input 1 4 5 Sampl ...

  7. 【BZOJ】【1565】【NOI2009】PVZ 植物大战僵尸

    网络流/最大权闭合子图+拓扑排序 感动死了>_<,一年多以前刚知道网络流的时候听说了这道名字很带感的题目,现在终于有实力切掉它了. 这题是最大权闭合子图模型的经典应用<_<,首 ...

  8. 【BZOJ】【1026】【SCOI2009】Windy数

    数位DP cxlove基础数位DP第三题 = =预处理是个很有用的东西!然后就是分类讨论! /***************************************************** ...

  9. [CF]codeforces round#366(div2)滚粗记

    开场心理活动:啊打完这场大概有1700了吧 中途心理活动:啊这个ABC看起来都随便做啊 死亡原因:欸怎么没网了 -75 .. A [题意]Hulk说完一句I hate会说that I love 然后是 ...

  10. C#中sealed关键字

    C#中sealed关键字 1. sealed关键字     当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承.类似于Java中final关键字.     在下面的示例中,类 B ...