AtCoder Beginner Contest 443 部分题目题解

比赛传送门:AtCoder Beginner Contest 443

G 题解

先推个式子。

\[\begin{aligned} &\phantom{\iff }\ k < (Ak+B) \bmod M\\ &\iff k+1 \le Ak+B-M\left\lfloor\frac{Ak+B}M \right\rfloor \\ &\iff \left\lfloor\frac{Ak+B}M \right\rfloor \le \frac{(A-1)k+(B-1)}M\\ &\iff \left\lfloor\frac{Ak+B}M \right\rfloor \le \left\lfloor\frac{(A-1)k+(B-1)}M\right\rfloor\\ \end{aligned} \]

容易发现 \(\displaystyle \left\lfloor\frac{Ak+B}M \right\rfloor-\left\lfloor\frac{(A-1)k+(B-1)}M \right\rfloor\) 只能为 \(0\)\(1\)

那么答案即为 \(\displaystyle N-\sum_{k=0}^{N-1} \left(\left\lfloor\frac{Ak+B}M \right\rfloor-\left\lfloor\frac{(A-1)k+(B-1)}M \right\rfloor\right)\)

类欧即可。

#include<bits/stdc++.h>
#include<atcoder/math>
#define int long long
#define double long double
using namespace std;
using namespace atcoder;
inline int read(){
	char c=getchar();
	int f=1,ans=0;
	while(c<48||c>57) f=(c==45?f=-1:1),c=getchar();
	while(c>=48&&c<=57) ans=(ans<<1)+(ans<<3)+(c^48),c=getchar();
	return ans*f;
}
main(){
	int T=read();
	while(T--){
		int n=read(),m=read(),a=read(),b=read();
		printf("%lld\n",n-(floor_sum(n,m,a,b)-floor_sum(n,m,a-1,b-1)));
	}
    return 0;
}
posted @ 2026-01-31 23:29  OTn53_qwq  阅读(5)  评论(0)    收藏  举报