2017.1.18【初中部 GDKOI】模拟赛B组

T1:我们可以枚举出n的因数,设这个因数为i,f(i)表示1到i-1与i互质的所有数的和。关键是怎样求出f(i)。我们首先要知道一个性质:如果x与i互质,那么i-x一定与i互质。

那么f(i)=i*phi(i)/2,phi(i)表示1到i-1直间与i互质的数的个数。这条公式的意义为:有phi(i)个数,而它们中间有phi(i)/2对数的和为i,所以它们的和为i*phi(i)/2。phi(i)是欧拉函数,计算公式是i(1-1/p1)(1-1/p2)...(1-1/pm),pj表示的是i的质因数。

这题我们在输入n之前求出1到100000之间的质数,用sqrt(n)求出n的因数,在直接枚举计算就好了。不过要注意i包含一个很大的质数的情况,我被这个地方坑了好久。


T2:这题分类讨论。

先把输入的字符串按字典序从小到大排序。

然后我们取每个字符串前20位,压成二进制,做成这个字符串的哈希表。

如果p>0或q>0

  如果p>0

    我们知道一定有解,于是我们枚举每一个字符串,如果与它相同的个数为p,并且与它完全不同的个数为q,则直接输出它(用哈希表判断),结束。

  如果q>0

    我们知道一定有解,于是我们枚举每一个字符串,如果与它相同的个数为q,并且与它完全不同的个数为p,则直接输出与它完全不同的字符串。

  如果p>0或q>0,而上面又找不出解,那么输出-1。

如果p=q=0

  我们用递归枚举正解,如果发现一个枚举到的字符串与输入的字符串每一个相同,那么输出枚举到这个字符串。

你可能感兴趣的:(【初中部,NOIP提高组,】模拟赛B)