第一次做B组的题目,果然难度不是一个级别的...
C组的题目是有可能可以考场做出,即使没做出,知道方法后也是较容易实现的...
而B组,以我现在的水平....不想说,对不起教我的人了....智商太低是不能一下子弥补的....
T1:给出一个数h,求出等式h=x*y+x+y中的x,y有多少种可能.
很明显
h=x*y+x+y
可以变成
h=x*(y+1)+y
= h=(x+1)*(y+1)-1
= h+1=(x+1)*(y+1).
所以,我们只需分解h+1的质因数,通过等式
p=p1^q1*p2^q2*p3^q3....*pn^qn
(p1是第一个分解质因数的数,q1第一个分解质因数的数的个数)
则
可得p的因数个数为(q1+1)*(q2+1)*(q3+1)*....*(qn+1).
枚举质因数大概只需要1500个左右,如果最后枚举完质因数后还需要继续分解的话,则直接将答案*2即可(因为z[1500]*z[1500]已经大于10^9了)
T2:
一道区间DP的题目.
设f[i,j]表示区间i~j能压缩成的最短字符串,当有多个最短字符串时则只保存一个,d[i,j]则是存要多少个最短字符串.
我们把f[i,j]分成
f[i,k] f[k+1,j]两个状态.
则当f[i,k]=f[k+1,j]的时候,我们直接把f[i,j]赋值为其中的一个值,并把d[i,j]更新成d[i,k]+d[k+1,j]的和.
当不等的时候,我们则判断,把f[i,k]展开的最优值(的确有两种“展开”方式,一种是直接展,一种是用数字表示的展开)与f[k+1,j]展开的最优值相比,如果两者的最优值小于f[i,j]的最优值的话则更新f[i,j],并把d[i,j]赋值为1.
最后输出f[i,j]的最优展开方法即可.
(这道题细节很多,可能是我实现的没有技巧,导致很多细节地方出错,打了3000多b才A了..而别人0_0...)
T3:
对于输入的mi ai(1<=i<=n)
设上一次的值为mi-1,ai-1
我们总共需要进行n-1次“调整”,求出最后的答案.
我们需求出一个数mod mi=ai,
则也可表示为
mi-1*k+ai-1 mod mi=ai(这是因为我们必须在保证x 也能mod mi-1=ai-1)这个k是我们需要枚举的,很明显范围在cm(mi,mi-1)(cm表示公倍数)
超出和这个范围,则表示mod mi=ai是无解的.
然后cm(mi,mi-1)则可以更新为mi的值..