一道公式题——数三角形

数三角形(count)

时限:10s 内存:512M

刚刚上大学的洁洁在学习组合数学的过程中遇到一道麻烦的题目,她希望你能帮助她解决。给定一张无向完全图G,其中大部分边被染成蓝色,但也有一些边被染成红色或者绿色。现在,洁洁需要给这张图的多样性进行打分。一张图的多样性取决于它的同色和异色三角形的个数。具体来说,G中每有一个三边颜色不同的三角形可以得3分,每有一个三边颜色相同的三角形则要被扣掉6分,其它三角形不得分也不扣分。

现在,请你写一个程序来计算G的多样性分数。

输入数据:

第一行两个正整数n和m其中n表示G中顶点的个数,m表示G中红色或者绿色的边的条数。

接下来m行每行包括三个整数a b c,代表连接顶点a和顶点b的边颜色为红色(c=1)或者绿色(c=2)

输出数据:

一行,G的多样性得分 mod 9973 的值。

 

样例输入1

4 3

1 2 1

1 3 1

2 3 1

样例输出1

9967

样例输入2:

4 4

1 2 1

1 3 1

2 3 1

1 4 2

样例输出2

0

数据范围:

对于20%的数据,n<=500

对于40%的数据,n<=2000

对于100%的数据,n<=50000,m<=200000。

 

本题考查组合计数方法,算两次。本题的关键是计算∠的个数。一个角由一个顶点和两条边组成。

用A1,A2,A3分别表示两边为红绿,红蓝和绿蓝的∠的个数。

用B1,B2,B3分别表示两边都是红,绿和蓝的∠的个数。

用S表示异色三角形的个数。

用T表示三边同色三角形的个数。

用L表示其它三角形的个数,即只有两种颜色的三角形的个数。

用算两次的方法,我们可以得到,

3S+2L=A1+A2+A3

L+3T=B1+B2+B3

这样一来,总得分为

3S-6T=A1+A2+A3-2B1-2B2-2B3

注意到所有Ai和Bi都可以简单地通过算出每个节点连出的不同颜色的边的条数算出。

这样一来就可以在线性时间完成计算。

【代码不给】

原文地址:https://www.cnblogs.com/ZDHYXZ/p/8724308.html

时间: 2024-10-03 15:15:20

一道公式题——数三角形的相关文章

一天一道算法题--5.29---动态规划之数塔

感谢微信平台:  一天一道算法题-------每天多一点进步----------- 这题的话 我就直接用我们自己Oj的题目了 戳我 好吧  如今看这题  是很简单  当时 是块被它搞崩溃了   因为 还不知道  dp 这个概念 现在有了这个概念   好多了  但还是 只能做做这种水 dp.... 多么悲伤的故事 这题 因为太水了   晚上 应该会去找个高质量的题来做的 如果你是dp刚刚学 这题真的很适合你 1 #include <iostream> 2 #include <cstring

一天一道算法题---6.11---大数阶乘

感谢微信平台----一天一道算法题----每天多一点进步 大数的概念 感觉是我接触acm 1 2 个月之后才有的....64位的Long long 和 __int64 也大概都是那时候才有的.. 大数 相加 相乘 相除 求余  相减不知道 有没有... 都是应该要掌握的.. 可能 我也会陆续把上面的全慢慢贴上来 // 呆会就直接把 微信提供的代码给贴上来了  先要去次午饭了 早饭 午饭永远是连一起的 .......... // 刚刚碰到个最小生成树的题 第一次用了邻接表去做 蛮cool == 一

[CQOI 2014] 数三角形 &amp; 机械排序臂

数三角形 bzoj 3505 要知道一个公式就是(a,b)和(x,y)两点所成线段上面的整点数是gcd(a-x,b-y)-1,通过枚举原点到map上任意一点所能成的三角形,再平移,得到要去掉的三点共线的点对. 我当时弱智地弄了个O(n^6)的枚举,不过好歹还是对的拿了三十分. = =满分程序和30分程序几乎一样长. program triangle; var m,n,i,j:integer; ans,t:qword; function gcd(a,b:integer):integer; begi

一天一道算法题--6.19--二分搜索

感谢微信平台---一天一道算法题---每天多一点进步 这是昨天的 只贴下题目 == 再把今天的也是一样处理了   这2天 不想写 可能晚上会有改变吧.. problem: 给定一个最多包含40亿个随机排列的32位 二进制的无符号整数 找出不在文件中的数.显然 由于 2^32=4294967196大于4亿 所以缺少的数不止一个 现限制只能使用几个外部的临时文件和仅几百个字节的内存. ****************************** 过了明天 就没事了 =-= 一天一道算法题--6.19

一道推理题

题目:http://115.28.76.232/problem?pid=1115 题意:初始给定两个完美数1和3,如果都是完美数,那么也是完美数.现在给定一个数,判断 它是否是完美数. 分析:嗯,这道题Mayuyu有两种方法,第一种方法是按照题意有,那么我们进行递归直接判 断.这样做的时间复杂度很高,通过打表对一些数的观察发现,只需要看这个数是否只由3和5组成. 打表代码: #include <iostream> #include <string.h> #include <s

一天一道算法题--6.13---计算几何

感谢微信平台---一天一道算法题---每天多一点进步 本来 想在世界杯之前 可以 开开心心地A了今天的算法题  .... 竟然是计算几何 我高数 那么渣....... 这题 先放着吧..... 哎.... 链接 还是一样先放出来 . touch me 平常这个点 再过会 就应该要碎觉了 今天 = 个揭幕战 累死我的节奏,,, 现在去做点什么呢........... 一天一道算法题--6.13---计算几何,布布扣,bubuko.com

hpu 1695 一道签到题

一道签到题 时间限制: 2 Sec  内存限制: 128 MB 提交: 69  解决: 33 [提交][状态][讨论版] 题目描述 我想说这是一道签到题,意思就是本次测试中最水的一道,不过我这样说你真的愿意相信我吗?哈哈,题目是这样的给你一下小数,然后请告诉我分别告诉我这个小数的循环节的循环次数.循环节以及循环节长度 输入 输入包括多组测试数据每组测试数据1行,包括一个小数,小数的长度不超过200,小数大于0小于100 输出 分别输出这个小数的循环节的长度.循环节以及循环次数,中间以一个空格间隔

每天一道算法题:数字二进制形式中1的个数

题目:请实现一个函数,属于一个整数,输出该数二进制表示中1的个数,例如把9表示成二进制是1001,有2位为1.因此如果输入9,该函数输出2. 可能的死循环陷阱 看完题目,相信大家很快就能想到一个解题思路:先判断整数二进制表示中最右边的一位是否为1,接着把输入的整数右移一位,此时原来处于从右边起的第二位被移动至最右边了,再判断是不是1,这样每次移动一位,直到这个整数变成0,即能够得到整数二进制表示形式中1的个数,而现在问题变为如何判断数字的最后一位为1,其实这个也很简单,只需要将数字与1做与运算,

算法——一天一道算法题篇——找只出现一次的两个数

找只出现一次的两个数 题目: 一个整型数组里除了两个数字只出现一次之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 举例说明: 现在有一个数组:{1,3,4,2,4,3}; 假设数组元素的规模不是很大,想要找到只出现一次的元素,可以定义一个辅助数组,flag[100];里面存放的是数组元素出现的次数,flag数组的下标表示的是数组:{1,3,4,2,4,3}里的元素. 代码如下: package hello.ant; public class AlogArrayFind2 {