思路
我们要解的一个方程是ax+by+cz=w。显然枚举是O(n^3)会超时,生成函数无法解决x,y,z是负数的情况。注意到m的范围只有5000,所以考虑将方程转化为ax+by=w-cz然后枚举z(-5000,5000)再跑extgcd。由于x*(res/gcds)+k*b/gcds,y*(res/gcds)-k*a/gcds都属于[-m,m],我们能得到两个k的范围,它们的交集长度的累加就是答案。时间复杂度O(nlogn)
代码
1 |
|
真彩希帆のファン
我们要解的一个方程是ax+by+cz=w。显然枚举是O(n^3)会超时,生成函数无法解决x,y,z是负数的情况。注意到m的范围只有5000,所以考虑将方程转化为ax+by=w-cz然后枚举z(-5000,5000)再跑extgcd。由于x*(res/gcds)+k*b/gcds,y*(res/gcds)-k*a/gcds都属于[-m,m],我们能得到两个k的范围,它们的交集长度的累加就是答案。时间复杂度O(nlogn)
1 | #include <bits/stdc++.h> |