2 条题解
-
2
写一下这道题的类欧部分。
这个方程在 的范围内的整数解的个数便是题解所说的 。记 。
也就是说 其中 为整数。不难发现,有多少个合法的 就有多少个合法的整数解。
对于一个 其合法的充分必要条件是 。注意到 不成立。所以一个 合法当且仅当 。也就是说 满足 $\lceil\frac{kx-m}{p}\rceil\le t\le \lfloor\frac{kx}{p}\rfloor$。注意到对于固定的 这个区间左右区间至多差 1。
所以我们将对于固定的 的 的数量表示为 $\lfloor\frac{kx}{p}\rfloor-\lceil\frac{kx-m}{p}\rceil+1$。 所以 $c_k=\sum\limits_{x=1}^m \lfloor\frac{kx}{p}\rfloor-\lceil\frac{kx-m}{p}\rceil+1$。我们将这个难看的上取整去掉。
$$\lceil\frac{a}{p}\rceil=\lfloor\frac{a}{p}\rfloor+1-[p|a] $$带入上式 $c_k=\sum\limits_{x=1}^m \lfloor\frac{kx}{p}\rfloor-\sum\limits_{x=1}^m\lfloor\frac{kx-m}{p}\rfloor+[k^{-1}m\bmod p\le m]$。
很显然这个是 的类欧几里得的板子了。
记住:不要写unordered_map的记忆化,不写记忆化也可以随便跑。
提供一个这题用的类欧的板子。
long long f(int a,int b,int c,int n) { if(!a)return 1ll*b/c*(n+1); // unsigned long long has=gethas(a,b,c,n); // if(mem.find(has)!=mem.end())return mem[has]; if(a>=c||b>=c)return /*mem[has]=*/1ll*(1ll*n*(n+1)/2) *(a/c)+1ll*(n+1)*(b/c)+f(a%c,b%c,c,n);long long m=(1ll*a*n+b)/c; return /*mem[has]=*/1ll*n*m-f(c,c-b-1,a,m-1); }
信息
- ID
- 564
- 时间
- 5000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 89
- 已通过
- 3
- 上传者