Wannafly挑战赛29 B——白井黑子

链接:https://ac.nowcoder.com/acm/contest/271/B
来源:牛客网
 

题目描述:

kuroko 作为常盘台唯一的空间系能力者,在每年例行的能力测试中可绝对不能让 misaka 失望哦,但是由于她的等级只是 level 4「大能力者」,在能力测试中会遇到不少困难。kuroko 是一个凡事都会尽力的好女孩,所以请你帮她算出她最多能完成多少测试吧

对于空间系能力者测试的内容是检验对物体进行空间移动的能力,测验时一共有 n 个物品放在一条直线上,每个物品都有一个坐标 ai ,kuroko 可以选择两个物品并使用能力交换它们的位置,但是如果两个物品的坐标不满足 kuroko 的计算公式的话,她就没有办法使用能力。

具体来说,对于坐标 ai ,其在 kuroko 的计算公式中是用参数 f(ai) 表示的。f(ai) 是 ai 各数位相乘的结果,由于 level 4「大能力者」在学园都市中也是很强大的存在,所以满足公式的条件不会太苛刻,对于两个物品 ai, aj ,如果 f(ai) x f(aj) 不能被某个自然数的 k 次幂表示 的话,那么 kuroko 就能对这两个物品使用能力。

现在 kuroko 想知道,有多少对物品她可以对其施展能力,知道了这个后她就知道自己能完成多少测验了。

这里认为任何自然数的 0 次幂都是 1。

输入描述:

第一行两个数,n, k 。

第二行共 n 个数 ai 表示这 n 个物品在直线上的坐标。

输出描述:

输出共一个数,表示 kuroko 能对其使用能力的无序物品对数。

 

题解:

作为科学超电磁炮的粉丝,我看到这场比赛的题目背景,自然是激动不已,以至于将这道题的题意给理解错了QAQ。。。赛后看了看大佬们写的题解,感觉这道题目的处理方法还是比较巧妙的,有必要写个博客,记录下来。

首先,注意到f(a_{i})是某个整数各个数位相乘的结果,这说明它可以表示成若干个个位数的乘积,并可以进一步化成质数2,3,5,7的幂的乘积,即f(a_{i})=2^{A_{1}}*3^{A_{2}}*5^{A_{3}}*7^{A_{4}},同理另一个数f(a_{j})=2^{B_{1}}*3^{B_{2}}*5^{B_{3}}*7^{B_{4}}f(a_{i})*f(a_{j})=2^{A_{1}+B_{1}}*3^{A_{2}+B_{2}}*5^{A_{3}+B_{3}}*7^{A_{4}+B_{4}}

接下来,若f(a_{i})*f(a_{j})能表示成自然数的k次幂,则(A_{i}+B_{i})(i=1,2,3,4)这四个数能提取公因子k,或者说,这四个数modk的结果为0。

下面就有难点了,如何将所有可以转移的物品对数统计出来呢?直觉告诉我们,不能转移的物品对数比能够转移的物品对数更容易统计,为此我们先统计哪些物品不能转移,然后总对数减去它就行了。

假如这里的(A_{i}+B_{i})不是四个数,而是一个,怎么办?我们发现,若(A+B)%k=0,那么((A+c*k)+B)%k=0,可见,A与A+c*k在这个方面有着相同的性质,可以归为相同的一类。这样,我们将所有数值都对k取模,将具有相同性质的数值简化为了相同的形式,且对于类别A,有唯一确定的类别B,使得(A+B)%k=0。我们用mp[i]表示当前属于类别i的数值的个数,每读入一个数值,答案就增加mp[k-i]。

对于(A_i+B_i)是四个数的情况,我们同样使用“简化形式”的方法进行统计,只不过mp不是一个简单的数组,而是一个由结构体类型到整数类型的映射(map)。

代码写得又臭又长,这里就不往外摆了,可以看看大佬们写的代码,思路是差不多的。

发布了27 篇原创文章 · 获赞 11 · 访问量 3610

猜你喜欢

转载自blog.csdn.net/Megurine_Luka_/article/details/88350762
今日推荐