2853: 小A的游戏昵称(郑轻oj)

2853: 小A的游戏昵称(郑轻oj)_第1张图片

这个题,算是一道思维题;

拿到这个题,脑子一下蹦出来暴力for,但看到1e9这个范围就明白——》暴力铁T

紧接着就会想到等差数列求和公式(如果想到这里,已经成功一大半了)

3 5 7的等差求和,但存在多加的部分(例如 15 21 35....)

所以我们还需思考,它们之间的关系!

如图所示:

2853: 小A的游戏昵称(郑轻oj)_第2张图片

注:该图片是某大佬提供的。

所以我们需要算

3,5,7的所有倍数和,  减去15、21、35的所有倍数和 ,加上 105的倍数和。

结果就是答案。

AC代码如下:

#include
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<

 注意 开int 是过不去的,注意看范围!

 注意 要边计算边mod,最后再mod一下;

 最后感谢您的阅读!!!

你可能感兴趣的:(算法,acm竞赛,c++)