题解 CF1731B Kill Demodogs
大家好,我是 CQ-C2024 级蒟蒻 CJH。
题意
题面翻译十分清楚。
分析
一道显然的贪心题目,本人提供一种懒人做法(同时也是洛谷最短解)。
只需要不停地向右、向下取每一个数即可。
这里推荐一个网站:OEIS。
这是一个数列分析网站,收录了许许多多的数列。
你只需要把前几个手算出来,接着以逗号或者空格为分隔符的形式输入进去。如果担心不是这个规律,你可以多算几个。
你可以找到这个答案的数列为:OEIS A002412。
可以发现数列的通项公式即答案为 $\dfrac{n(n+1)(4n-1)}{6}$。
又因为 $2\le n\le 10^9$,所以答案一定是小于 $2^{127}\approx10^{36}$ 的,完全可以使用 __int128 来存储!再也不需要担心溢出了!
在输出的时候取模完后直接强制转换类型为 long long 即可!单次时间复杂度 $O(1)$。
注意事项
__int128在部分语言标准中是无法使用的(会编译错误),所以使用时请选择C++17及以上的语言标准。- 在计算 $4n-1$ 时,要使用
4ll*n-1而不是4*n-1,否则会默认为int类型导致溢出。
代码
//the code is from chenjh
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
void solve(){
int n;scanf("%d",&n);
printf("%lld\n",(long long)((__int128)((__int128)n*(n+1)*(4ll*n-1)/6)%mod*2022%mod));//取模以后再强转类型!否则可能会溢出!
}
int main(){
int t;scanf("%d",&t);
while(t--) solve();
return 0;
}
如有笔误,请在此博客下回复或者私信我,本人将尽快修改!

浙公网安备 33010602011771号