bzoj 2327 构图暴力判断+独立集个数
首先我们可以处理出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 构图暴力判断+独立集个数的更多相关文章
- [算法]判断一个数是不是2的N次方
		
如果一个数是2^n,说明这个二进制里面只有一个1.除了1. a = (10000)b a-1 = (01111)b a&(a-1) = 0. 如果一个数不是2^n, 说明它的二进制里含有多一 ...
 - 如何判断一个数是否为素数(zt)
		
怎么判断一个数是否为素数? 笨蛋的作法: bool IsPrime(unsigned n){ if (n<2) { //小于2的数即不是合数也不是素数 throw 0; ...
 - 腾讯面试题 腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
		
腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中? 这个题目已经有一段时间了,但是腾讯现在还在用来面试.腾讯第一次面 ...
 - pyhton 查找一个数的所有因子  以及 判断一个数是否是质数 两个小脚本
		
最近看到一个网站, 欧拉计划.挺好玩,都是一些算法题.这是本站:http://projecteuler.net/problems 这个是中文站:http://pe.spiritzhang.com/ 下 ...
 - #6   判断一个数是否为2的n次方
		
「ALBB面试题」 [题目] 如何判断一个数是否为2的n次方 [题目分析] 看到这种题,相信大家第一反应就是循环除2,这样做肯定是可以得出结果的:但是这种做法无疑大大增加了计算机的运行时间,一个非常大 ...
 - 使用二分查找判断某个数在某个区间中--如何判断某个IP地址所属的地区
		
一,问题描述 给定100万个区间对,假设这些区间对是互不重叠的,如何判断某个数属于哪个区间? 首先需要对区间的特性进行分析:区间是不是有序的?有序是指:后一个区间的起始位置要大于前一个区间的终点位置. ...
 - 海量数据找相同数,高配词,不重复的数,判断一个数是否存在,查询串,不同电话号码的个数,中位数,按照query频度排序,topk
		
这类题目,首先需要确定可用内存的大小,然后确定数据的大小,由这两个参数就可以确定hash函数应该怎么设置才能保证每个文件的大小都不超过内存的大小,从而可以保证每个小的文件都能被一次性加载到内存中. 1 ...
 - python练习题-简单方法判断三个数能否组成三角形
		
python简单方法判断三个数能否组成三角形 #encoding=utf-8 import math while True: str=raw_input("please input thre ...
 - 【位运算】判断一个数是否为2的n次方
		
import java.util.Scanner; /** * 功能:用位运算,判断一个数是否为2的n次方. * 思路:用1做移位操作,然后判断移位后的值是否与给定的数相同. */ public cl ...
 
随机推荐
- Permission Lists Assigned to a User
			
SQL that I find useful in many occasions. It will return a list of permissions that are assigned to ...
 - aspx页面与服务器控件间运行原理
			
一.进入服务器控件以及aspx页面前,必须的准备: a)在WebForm 中只要带有runat="server" 那么那就是一个控件. b)如果form有runat="s ...
 - SQL中迁移sql用户及密码脚本
			
SQL中迁移sql用户及密码脚本 编写人:CC阿爸 2014-6-20 在日常SQL数据库的操作中,常常需要迁移数据库或重装服务器,这时候,一些之前建立的login账户,必须重新建立,以下可以通过 ...
 - js根据日期获得星期
			
var weekday = getWeekday('2013-9-26'); function getWeekday(sDate){ var dt = new Date(sDate.replace(/ ...
 - Windos中无法删除桌面IE图标的解决方法
			
解决方法其实并不难,打开注册表,转到如下图的位置,详细地址在图片最下面: 需要注意的是,你需要在NameSpace中逐个查看各个项目的数据值,显示为数据值为Internet Explorer的项目即为 ...
 - python的pip和virtualenv使用心得
			
pip可以很方便的安装.卸载和管理Python的包.virtualenv则可以建立多个独立的虚拟环境,各个环境中拥有自己的python解释器和各自的package包,互不影响.pip和virtuale ...
 - 帮朋友 解决一道 LeetCode QJ上问题
			
引言 对于刷题,自己是没能力的. 最经一个朋友同事考我一道数组题 . 也许能当面试分享吧. 娱乐娱乐. 事情的开始是这样的. 前言 题目 截图 大概意思 是 在一个 数组中,找出其中两个不重复出现的元 ...
 - ASP.NET实现弹出框真分页将复选框选择的数据存到数据库中(四)
			
这是第四步点击保存将信息存入数据库中. 这个就简单了利用ajax将JSON字符串传到后台然后这里有个知识点就是将DataTable直接存入数据库中.代码如下: 一.界面获取数据JS代码: //保存订单 ...
 - brew mac osx 上软件包管理工具
			
今天推荐 Mac OSX 下,方便高效的包管理工具 brew brew 的全名叫做 Homebrew 它的功能类似于 ubuntu 下同下 apt-get ,或者 Cent OS 下的 yum 等包管 ...
 - [译]rabbitmq 2.1 Consumers and producers (not an economics lesson)
			
我对rabbitmq学习还不深入,这些翻译仅仅做资料保存,希望不要误导大家. For now, all you need to know is that producers create messag ...