题目链接: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. centos crontab 定时任务详解

    安装crontab: yum install crontabs 说明: /sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 ...

  2. 2016 系统设计第一期 (档案一)jQuery ajax serialize()方法form提交数据

    jQuery ajax serialize()方法form提交数据,有个很奇怪的问题,好像不能取到隐藏控件的值. //点击提交按钮保存数据 $('#btn_submitUser').click(fun ...

  3. 通过注册表检测UAC是否处于关闭状态(不弹窗)

    注册表路径: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System UAC各级别对应的注册表值: 从 ...

  4. wampserver修改mysql数据库密码后phpMyAdmin无法连接数据库

    phpMyAdmin开始能打开,但是我在权限里把root的密码改了,再打开phpMyAdmin就显示:“phpMyAdmin 试图连接到 MySQL 服务器,但服务器拒绝连接.您应该检查 config ...

  5. nodejs Q.js promise

    var Q = require("q"); documentation for Qhttps://github.com/kriskowal/qhttps://github.com/ ...

  6. VBS基础篇 - 堆栈

    VBS中的堆栈需要使用System.Collections.Stack '建立堆栈 Dim Stk : Set Stk = CreateObject("System.Collections. ...

  7. 【经验】Angularjs 中使用 layDate 日期控件

    layDate 控件地址:http://laydate.layui.com/ 前情:原来系统中使用的日期控件是UI bootstrap(地址:https://angular-ui.github.io/ ...

  8. c# 取 list前100条数据

    [问] List<KeyWord> sortedList = (from a in keyWordList orderby a.Total descending select a).ToL ...

  9. [转载]C#获取进程的主窗口句柄

    public class User32API { private static Hashtable processWnd = null; public delegate bool WNDENUMPRO ...

  10. [设计模式] 8 组合模式 Composite

    DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字“树形”.这种树形结构在现实生活中随处可见,比如一个集团公司,它有一 ...