首先我们可以处理出10^6以内的所有的勾股数,如果我们有2*i-1和2*j互质,

那么A=(2*i-1)*(2*i-1)+(2*i-1)*(2*j),B=2*j*j+(2*i-1)*(2*j)为互质

勾股数对,且保证所有的互质勾股数对都有这个性质,保证了了我们暴力可以枚举

所有的勾股数对

那么我们得到所有的勾股数对后,可以建图,得到一张类似于树的图,然后可能会有

一些环,但是比较少,一棵树的独立集个数是可以DP求的,那么这样的图可以暴力

规定每条非树边的两个端点取不取来每次都DP,得出所有情况,这样就行了。

/**************************************************************
    Problem:
    User: BLADEVIL
    Language: Pascal
    Result: Accepted
    Time: ms
    Memory: kb
****************************************************************/
 
//By BLADEVIL
const
    d39                         =;
     
var
    n                           :longint;
    pre, other                  :array[..] of longint;
    last                        :array[..] of longint;
    l                           :longint;
    c, cur                      :array[..] of longint;
    pi                          :array[..] of longint;
    ans                         :int64;
    tot, sum                    :longint;
    flag                        :array[..] of boolean;
    b                           :array[..,..] of longint;
    w                           :array[..,..] of int64;
     
     
function gcd(a,b:longint):longint;
begin
    if b>a then exit(gcd(b,a)) else
    if b= then exit(a) else exit(gcd(b,a mod b));
end;
 
procedure connect(x,y:longint);
begin
    inc(l);
    pre[l]:=last[x];
    last[x]:=l;
    other[l]:=y;
end;
     
procedure make;
var
    i, j                        :longint;
    x, y                        :longint;
begin
    for i:= to do
        for j:= to do
            if gcd(*i-,*j)= then
            begin
                x:=(*i-)*(*i-)+(*i-)*(*j);
                y:=*j*j+(*i-)*(*j);
                if (x<=) and (y<=) then
                begin
                    connect(x,y);
                    connect(y,x);
                end;
            end;
end;
 
procedure init;
var
    i                           :longint;
    x                           :longint;
     
begin
    read(n);
    for i:= to n do
    begin
        read(x);
        inc(c[x]);
    end;
    pi[]:=;
    for i:= to n do pi[i]:=pi[i-]* mod d39;
    ans:=;
end;
 
procedure dfs(x,fa:longint);
var
    q, r, p                     :longint;
    f                           :boolean;
begin
    flag[x]:=true;
    q:=last[x];
    r:=;
    while q<> do
    begin
        p:=other[q];
        f:=true;
        if c[p]> then
        begin
            if not flag[p] then
                dfs(p,x) else
            if p<>fa then
            begin
                if x<p then
                begin
                    inc(tot);
                    b[tot,]:=x;
                    b[tot,]:=p;
                end;
                if r<> then
                    pre[r]:=pre[q] else
                    last[x]:=pre[q];
                f:=false;
            end;
        end;
        if f then r:=q;
        q:=pre[q];
    end;
end;
 
procedure dp(x,fa:longint);
var
    q, p                        :longint;
 
begin
    q:=last[x];
    w[x,]:=; w[x,]:=pi[c[x]]-;
    if cur[x]= then w[x,]:=;
    if cur[x]= then w[x,]:=;
    while q<> do
    begin
        p:=other[q];
        if (c[p]>) and (p<>fa) then
        begin
            dp(p,x);
            w[x,]:=w[x,]*(w[p,]+w[p,]) mod d39;
            w[x,]:=w[x,]*w[p,] mod d39;
        end;
        q:=pre[q];
    end;
end;
 
procedure dfs_q(p,num:longint);
var
    x, y, curx, cury            :longint;
begin
    if p>tot then
    begin
        dp(num,);
        sum:=(sum+w[num,]) mod d39;
        sum:=(sum+w[num,]) mod d39;
        exit;
    end;
    x:=b[p,]; y:=b[p,];
    curx:=cur[x]; cury:=cur[y];
    if (curx<>) and (cury<>) then
    begin
        cur[x]:=;
        cur[y]:=;
        dfs_q(p+,num);
        cur[x]:=curx;
        cur[y]:=cury;
    end;
    if (curx<>) then
    begin
        cur[x]:=;
        dfs_q(p+,num);
        cur[x]:=curx;
        cur[y]:=cury;
    end;
      
end;
 
procedure main;
var
    i                           :longint;
begin
    for i:= to do
        if (c[i]>) and (not flag[i]) then
        begin
            tot:=;
            sum:=;
            dfs(i,);
            dfs_q(,i);
            ans:=ans*sum mod d39;
        end;
    if ans= then ans:=d39;
    writeln(ans-);
end;
 
begin
    make;
    init;
    main;
end.

bzoj 2327 构图暴力判断+独立集个数的更多相关文章

  1. [算法]判断一个数是不是2的N次方

    如果一个数是2^n,说明这个二进制里面只有一个1.除了1. a  = (10000)b a-1 = (01111)b a&(a-1) = 0. 如果一个数不是2^n, 说明它的二进制里含有多一 ...

  2. 如何判断一个数是否为素数(zt)

    怎么判断一个数是否为素数? 笨蛋的作法: bool IsPrime(unsigned n){    if (n<2)    { //小于2的数即不是合数也不是素数    throw 0;    ...

  3. 腾讯面试题 腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

    腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?  这个题目已经有一段时间了,但是腾讯现在还在用来面试.腾讯第一次面 ...

  4. pyhton 查找一个数的所有因子 以及 判断一个数是否是质数 两个小脚本

    最近看到一个网站, 欧拉计划.挺好玩,都是一些算法题.这是本站:http://projecteuler.net/problems 这个是中文站:http://pe.spiritzhang.com/ 下 ...

  5. #6 判断一个数是否为2的n次方

    「ALBB面试题」 [题目] 如何判断一个数是否为2的n次方 [题目分析] 看到这种题,相信大家第一反应就是循环除2,这样做肯定是可以得出结果的:但是这种做法无疑大大增加了计算机的运行时间,一个非常大 ...

  6. 使用二分查找判断某个数在某个区间中--如何判断某个IP地址所属的地区

    一,问题描述 给定100万个区间对,假设这些区间对是互不重叠的,如何判断某个数属于哪个区间? 首先需要对区间的特性进行分析:区间是不是有序的?有序是指:后一个区间的起始位置要大于前一个区间的终点位置. ...

  7. 海量数据找相同数,高配词,不重复的数,判断一个数是否存在,查询串,不同电话号码的个数,中位数,按照query频度排序,topk

    这类题目,首先需要确定可用内存的大小,然后确定数据的大小,由这两个参数就可以确定hash函数应该怎么设置才能保证每个文件的大小都不超过内存的大小,从而可以保证每个小的文件都能被一次性加载到内存中. 1 ...

  8. python练习题-简单方法判断三个数能否组成三角形

    python简单方法判断三个数能否组成三角形 #encoding=utf-8 import math while True: str=raw_input("please input thre ...

  9. 【位运算】判断一个数是否为2的n次方

    import java.util.Scanner; /** * 功能:用位运算,判断一个数是否为2的n次方. * 思路:用1做移位操作,然后判断移位后的值是否与给定的数相同. */ public cl ...

随机推荐

  1. zabbix2.4 安装配置

    首先从www.zabbix.com下载rpm包: 接下来我要配置一台zabbix server,自己监控自己即使服务端又是客户端,zabbix web gui和zabbix数据库都放在同一台主机上,除 ...

  2. DXperience重编译汉化的方法

    1. 必须有DXperience相应版本的全部源代码SourceCode.把全部源代码复制到\Program Files\Developer Express .NET vX.X\Sources目录.目 ...

  3. 部署到iis后,发现无法加载运行CSS文件

    解决方法: 打开或关闭window功能中的Internet信息服务里的万维网服务=>常见HTTP功能=>静态内容

  4. RAP开发入门-搭建RAP开发环境(一)

    ps:补充 RAP (Remote Application Platform) 官网地址eclipse.org/rap 1.下载IDE http://www.eclipse.org/downloads ...

  5. 在Java如何保证方法是线程安全的

    废话开篇 都说Java程序好些,但是我觉得Java编程这东西,没个十年八年的真不敢说自己精通Java编程,由于工作原因,开始转战Java多线程,以前没怎么接触过,所以想留点脚印在这两条路上. 切入正题 ...

  6. 6.24AppCan移动开发者大会价值30万的展示机会归了谁?

    最近,小编的邮箱都被挤爆了! 来自开发者的邮件一封封涌进邮箱,VIP展位申请,TOP30 APP评选,感谢大家的积极参与,展位有限,APP名额有限,开发者的热情无限. 经过谨慎筛选.综合评定后,以下5 ...

  7. Unity3d Shortcuts

    参考:http://www.ceeger.com/Manual/ 场景视图导航  Click-drag to drag the camera around. 点击拖拽平移场景视图 Hold Alt a ...

  8. ubuntu 修改ssh远程主机名称,mac开机运行命令,静默方式启动virtual box虚拟机,静默执行run脚本

    一.修改主机名 ssh登陆 vi /etc/hostname vi /etc/hosts hostname ulocal (执行这个命令,无须重启服务器) 保证127.0.0.1 的hostname与 ...

  9. ubuntu server 14.10 安装 nodejs

    apt-get install nodejs 会报错,提示内核版本过低.如果升级,可能遇到提示boot空间不足,要求释放更多空间: sudo aptitude purge ~ilinux-image- ...

  10. Go defer延迟执行

    defer用于延迟执行,可以类比于java或c++中的析构函数. 查看一段示例代码: func Contents(filename string) (string, error) { //打开文件 f ...