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;
}

浙公网安备 33010602011771号