这个题,算是一道思维题;
拿到这个题,脑子一下蹦出来暴力for,但看到1e9这个范围就明白——》暴力铁T
紧接着就会想到等差数列求和公式(如果想到这里,已经成功一大半了)
3 5 7的等差求和,但存在多加的部分(例如 15 21 35....)
所以我们还需思考,它们之间的关系!
如图所示:
注:该图片是某大佬提供的。
所以我们需要算
3,5,7的所有倍数和,? 减去15、21、35的所有倍数和 ,加上 105的倍数和。
结果就是答案。
AC代码如下:
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
long long sum = 0;
//走等差数列
//暴力铁T
long long three = n/3;
long long five = n/5;
long long seven = n/7;
long long one_five = n/15;
long long two_one = n/21;
long long three_five = n/35;
long long one_0_five = n/105;
cout<<(((3+3*three)*three/2)%998244353+((5+5*five)*five/2)%998244353+
((7+7*seven)*seven/2)%998244353-((15+15*one_five)*one_five/2)%998244353
-((21+21*two_one)*two_one/2)%998244353-((35+35*three_five)
*three_five/2)%998244353+((105+105*one_0_five)*one_0_five/2)%998244353)%998244353<<endl;
return 0;
}
?注意 开int 是过不去的,注意看范围!
?注意 要边计算边mod,最后再mod一下;
?最后感谢您的阅读!!!
|