欢乐赛#69 T6 题解
2026-03-28 19:02:01
发布于:北京
70阅读
0回复
0点赞
整个欢乐赛#69 就这一题有点难度。
想要证明的话需要一些数论知识。
证明:( 为整数)。
令 ( 为整数),
则 。
注意此处 。
证明:( 为整数)。
令 ( 为整数),
则 。
注意此处 。
根据以上的两个证明,可知边做边取模并不影响计算的结果,所以就有了 40 pts 代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
int n,x,y,z;
signed main(){
cin>>n>>x;
while (n--){
cin>>y>>z;
x=max(x+y,x*z);
x%=mod;
}
cout<<x;
return 0;
}
注意到上面加粗的文字,这种做法并不会影响到计算的结果,但会影响到你的选择。
口胡 hack:
上一轮 变为 ,取模后为 。
此时 ,你的代码会选择 操作,使其变为 。
但实际上 操作会使 变为 ,而 操作会使 变为 ,应选择后者。
但这并不意味着你不能边做边取模。
注意到 远小于模数,那么当至少完成一次取模时,若 ,那么一定选择 操作,否则一定选择 操作。
好的,100 pts 代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
int n,x,y,z;
bool f;
signed main(){
cin>>n>>x;
while (n--){
cin>>y>>z;
if (f){
if (z>1){
x*=z;
}
else {
x+=y;
}
x%=mod;
continue;
}
x=max(x+y,x*z);
if (x>mod){
f=1;
}
x%=mod;
}
cout<<x;
return 0;
}
以上全文共 1781 字符,肝了 40+ min,创作不易,点个赞扒。
全部评论 2
牛
2026-03-16 来自 湖南
1牛
2026-03-17 来自 浙江
0












有帮助,赞一个