2019.4.18
t1:给出不定方程ax+by+c=0,求x在x1~x2并且y在y1~y2时的解个数。考场上想的是一个扩欧板子敲下去,然后构造出x>=x1的最小解,同时得出y,然后通过通项来枚举x1~x2之间的x,判断y是否合法,然后累计答案即可。但正解并不需要枚举,因为x的通项是x=x0+kb,y是y=y0-kb,现在得出了x0,y0,也知道b,直接解一组不等式就好了:x1<=x0+kb<=x2,y1<=y0-kb<=y2,若k算出来不是整数:a<=k<=b,则下界上取整,上界下取整。考场用时:30min,得分50。
t2:给出一个圆的方程x2+y2=r2,求圆上有多少个坐标为整数的点。考场上先想了个暴力,两边先模上一个大质数p,然后转化为x2+y2Ξr2(mod p) => y2Ξr2-x2,枚举x,然后解出y2,判断y是否为整数,然后累加答案。而光是枚举就会超时。正解是,把圆方程看成一组勾股数,然后通过勾股数的特性来解。考场用时:2h(扩欧一直写挂),得分0。(数据真的强)
t3:定义函数f(n)=11*22*33*...*nn,一共q次询问,对于每次询问给出的r,求f(n)/(f(r)*f(n-r)) mod m。但是考试时给下来的题目把分母的括号吞了,就是:f(n)/f(r)*f(n-r) mod m,照着这个写就挂了。。。我的思路是(当然是求后面这个错式子的思路),离线处理,先线性算出f(i)%m,然后询问时求出f(r)的逆元就可以回答了。顺便写了个记忆化,把f(r)的逆元存了起来。但是好像一组数据之后忘了memset。。。当然那时的思路也是错的,因为f(r)不一定与m互质,不能够求逆元。正解是,把m分解质因数,分别计算对答案的贡献。考场用时:30min(先做的t1,t3),得分0(题目没错的话应该能拿一点)。