专栏文章
题解:CF1389E Calendar Ambiguity
CF1389E题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mioxzuz7
- 此快照首次捕获于
- 2025/12/03 02:59 3 个月前
- 此快照最后确认于
- 2025/12/03 02:59 3 个月前
CF1389E
入手
因为星期几有周期性,可以转化为同余问题。
移项并因式分解得:
我们将 改为 ,因为题目中 :
也就是:
现在请读者将 当作未知数来求解这个方程,求出未知数的范围,然后你或许就能解出这道题了。
我们将 改为 ,因为题目中 :
也就是:
现在请读者将 当作未知数来求解这个方程,求出未知数的范围,然后你或许就能解出这道题了。
解法
两边同除 :
因为
所以只能是:
我们换个元,令 。
因为
所以只能是:
我们换个元,令 。
此时,我们可以将问题简化了:
存在多少个数对 ,满足:
1 \leq x < y \leq \min(m, d), \\
D \mid (y - x).
\end{cases}$$
这个问题已经非常简单了,我们已经将一道蓝题转化为橙题了!
但你如果还需要做法:
令 $L=[1,\min(m, d)]$。
1. $y-x\leq 0$ 时,不满足 $x<y$
2. $y-x=D$ 的贡献为 $L-D$。
3. $y-x=2D$ 的贡献为 $L-2D$。
4. $y-x=kD$ 的贡献为 $L-kD$。
计算最大可能的 $k$,并将前 $k$ 项贡献使用等差数列求和来算总贡献。
## 代码
```cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll m,d,w;
ll gcd(ll a,ll b){return (!b?a:gcd(b,a%b));}
ll solve(){
scanf("%lld%lld%lld",&m,&d,&w);
ll L=min(m,d);// 指 x,y 介于 [1,L]
ll D=w/gcd(d-1,w);// D | y-x;
ll cnt=L/D;// 即上文中最大的 k
ll ans=cnt*L-D*(cnt+1)*cnt/2;
return ans;
}
signed main(){
int T;scanf("%d",&T);
while(T--)printf("%lld\n",solve());
}
```存在多少个数对 ,满足:
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...