栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

ZZULIOJ--2853: 小A的游戏昵称(容斥原理)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ZZULIOJ--2853: 小A的游戏昵称(容斥原理)

题目描述

7是一个神奇的数字,小A喜欢在游戏中使用7作为昵称,但有时会出现冲突,小A就会在后边添加一个5或者3,如果再重复会使用他们的倍数。今天小A想让你算一下小于等于N的正整数中,是3、5、7的倍数的数的总和。

输入

输入一个正整数N,(1<=N<=1e9)

输出

输出所有是3、5、7倍数的总和。结果对998244353取模。

样例输入 Copy

20

样例输出 Copy

119

来源/分类

 考察容斥原理。

对于求三集合并集的公式:

  A∪B∪C=A+B+C - A∩B - A∩C - B∩C + A∩B∩C

 

 第一遍的时候把每个浅蓝色的圈里的加上,那么3个红色形状的部分就加了两次,深蓝色的部分加了3次,那么我们就减去图中

 三个紫色的形状的图形(就是两个圆相交的部分),那么红色部分就是加了一次了,深蓝色部分减去3次(和之前加的3次抵消),因为我们要算整个图形的面积,所以再把那个深蓝色部分加上。

1+2+3+....n:如果n是偶数前n项和为sum=((n+1)*n)/2;  如果n是奇数前n项和为sum=((n+1)/2)*n;

注意最后的输出加上再取模防止出现负数:printf("%lldn",(sum1-sum2+998244353)%998244353);

#include
using namespace std;
typedef long long ll;
ll sum1=0,sum2=0;
ll add(ll sum,ll n,ll a)
{
	ll b=(n/a);
	if(b%2==0) b=((b+1)*b)/2;
	else b=((b+1)/2)*b;
	
	
	b=((b%998244353)*a)%998244353;
	sum=(b+sum)%998244353;
	return sum;
	
}
int main() {
	ll n;
	scanf("%lld",&n);
	
	sum1=add(sum1,n,3);
	sum1=add(sum1,n,5);
	sum1=add(sum1,n,7);
	sum1=add(sum1,n,3*5*7);
	
//	cout< 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/511069.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号