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