题目:点此
题目描述
绪萌同人社是一个有趣的组织,该组织结构是一个树形结构。有一个社长,直接下属一些副社长。每个副社长又直接下属一些部长……。
每个成员都有一个萌点的属性,萌点属性是由一些质数的萌元素乘积构成(例如,猫耳的值是2,弱气的值是3,黄毛的值是5,病娇的值是7,双马尾的值是11等等)
举个例子,正妹是双份的猫耳,而且有一份弱气,她的属性值为2*2*3=12。
现在组员关心一个问题,希望知道离自己最近且有相同萌元素上司是谁,例如,属性值为2、4、6、45这样的属性值都算是和正妹有相同的属性。
然而,组员可能会随时变化自己的属性。啊。。感觉好麻烦啊。。
思路
请大家记住:遇到题目先暴力!!!再优化!!!
所以,这道题就可以向上遍历,如果找到根还没找到具有同萌元素的上司,输出-1。
接着,什么是具有同萌元素?按照题目里来说,就是都有相同的质因数,就是最大公约数>1,辗转相除随便上!
最后main函数就是这几个函数的结合。
然后…暴力就这样神奇的过了。
犯的错误
1.存树只用一个parent数组就行了(存双亲)
2.为避免错,尽量数组下标从1开始,应为输入的编号99%从1开始,存储时从0开始会导致出错。
3.gcd(辗转相除函数)中不用交换a和b,举个例子,7、14,7%14=7,14%7=0。
4.puts函数会自动换行,不用在里边加\n。
5.数组int a={-1},会初始化成{-1,0,0,0……},所以用memset最有效。补充:memset(a,-1,sizeof(a)只能将a里的数据全部变成负数而不是-1,因为memset是以字节为单位的,都变成-1会让每一个元素变成10000001 100000001 100000001 100000001(int四字节),即-2122219135(不信你计算器算一遍)
收获
1.拿到题,先想树是邻接表还是逆邻接表,还是结合?逆邻接表parent数组,邻接表vector,结合就是两者都要。
2.数组下标尽量从1开始。
3.gcd函数中不用交换。
4.puts函数会自动换行。
5.初始化数组尽量用memset,不行就循环。