草庐IT

容斥定理 AtCoder——FizzBuzz Sum Hard

haggard 2023-03-28 原文

题目传送门

Problem Statement

Find the sum of integers between 1 and N (inclusive) that are not multiples of A or B.

Constraints

  • 1≤N,A,B≤10
  • All values in input are integers.

Input

Input is given from Standard Input in the following format:

N A B

Output

Print the answer.

Sample 1

Inputcopy Outputcopy
10 3 5
22

The integers between 1 and 10(inclusive) that are not multiples of 3 or 5 are 1,2,4,7 and 8, whose sum is 1+2+4+7+8=22.

Sample 2

Inputcopy Outputcopy
1000000000 314 159
495273003954006262

 

题意:

题目要求大致是在1到n中,求所以不是A和B倍数的数的和。

思路:

我们可以算出1到n里面所以数的和,之后减去A和B的倍数。

注意!!!

A和B公共的倍数我们减了两次(A一次B一次)。

首先是暴力的解法代码如下:

暴力
 #include<cstdio>
#include<iostream>
using namespace std;
int main()
{
    long long n, a, b, ans=0;
    scanf("%lld%lld%lld", &n, &a, &b);
    ans = n * (1 + n) / 2;
    long long x=0, y=0;
    for (int i = 1; x<= n ||y <= n; i++)
    {
        x =i*a, y =i*b;
        if (x <= n)
        {
            ans-=x;
            if (x % b == 0)
            {
                ans+=x;
            }
        }
        if (y <= n)
        {
            ans-=y;
        }
    }
    printf("%lld", ans);
}

但是!!!这样写会超时,所以我们应该换一种思路

优化
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
long long num, nu;
long long gcd(long long a, long long b)
{
	return a % b ? gcd(b, a % b) : b;
}
long long sum(long long x, long long y)
{
	return y*(x+y*x)/2;
}
int main()
{
	long long n, a, b, ans = 0;
	
	scanf("%lld%lld%lld", &n, &a, &b);
	long long bei = a * b / gcd(a, b);
	ans = n * (1 + n) / 2;
	 num = n/a;
	 nu = n/b;
	 ans -= sum(a, num);
	 ans -= sum(b, nu);
	 for (int i = 1; i <= n; i++)
	 {
		 if (i * bei > n)
			 break;
		 ans += (i * bei);

	 }
	printf("%lld", ans);
}

 

有关容斥定理 AtCoder——FizzBuzz Sum Hard的更多相关文章

  1. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  2. [电路]16-戴维宁定理和诺顿定理 - 2

    [电路]系列文章目录1-发出功率和吸收功率关系2-独立源和受控源3-基尔霍夫定律4-两端电路等效变换、电阻串并联5-电压源、电流源的串联和并联6-电阻的星形连接和角形连接等效变换(星角变换)7-实际电源模型和等效变换8-无源一端口网络输入电阻9-电路的图及相关概念10-支路电流法11-网孔电流法12-回路电流法13-结点电压法14-叠加定理和齐性定理15-替代定理16-戴维宁定理和诺顿定理文章目录[电路]系列文章目录一、戴维宁定理1定义2图示说明3说明4例题二、诺顿定理1定义2图示说明3说明三、特殊说明一、戴维宁定理1定义任何一个线性含源一端口网络,对外电路来说,总可以用一个电压源和电阻的串联

  3. c# - 在 C# 中应用 DeMorgan 定理手动优化条件语句中的 bool 表达式是否有用(例如 if 条件) - 2

    回到我用C和C++完成大部分工作的那一天,当然,我会手动申请deMorgan'stheorem优化任何重要的bool表达式。在C#中执行此操作是否有用,或者优化器是否不需要这样做? 最佳答案 在如此快的处理器上,重新排列bool表达式几乎不可能在速度上产生任何实际差异。而且C#编译器非常聪明,它也会优化它。优化可读性和清晰度! 关于c#-在C#中应用DeMorgan定理手动优化条件语句中的bool表达式是否有用(例如if条件),我们在StackOverflow上找到一个类似的问题:

  4. JavaScript - 分离轴定理 - 碰撞有效,但不响应? - 2

    所以,我正在尝试对我的SAT、圆-多边形、多边形-多边形碰撞应用响应。我将本文中的这段代码移植到JavaScript中:http://rocketmandevelopment.com/blog/separation-of-axis-theorem-for-collision-detection/现在,检测适用于所有类型,但响应失败并以疯狂的速度和错误的Angular进行,它不依赖于物体的质量(面积^2而不是质量)并且不应用Angular速度JSFiddle(重力不应用于模拟,用箭头键移动),JS中的第一部分是矢量,然后是物理,然后是主。这是我对形状的定义:(必须为“JSFiddle”链

  5. AtCoder Beginner Contest 300 - 2

    A-N-choicequestion(abc300a)题目大意给定一个元素互不相同的数组\(c\)和\(a,b\),找到\(i\)使得\(c_i=a+b\)解题思路直接for循环寻找即可。神奇的代码#includeusingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);intn,a,b;cin>>n>>a>>b;for(inti=0;i>c;if(c==a+b){coutB-SameMapintheRPGWorld(abc300b)题目大意给定两个矩阵

  6. 中国剩余定理(CRT)学习笔记 - 2

    约定\(A\perpB\)表示\(\gcd(A,B)=1\)。\(A\midB\)表示\(B\equiv0\pmod{A}(A\neq0)\)。引入考虑以下这道题:有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二。問物幾何?——《孫子算經》也就是说,求出下列关于\(x\)方程组的最小整数解:\[\begin{cases}x\equiv2\pmod{3}\\x\equiv3\pmod{5}\\x\equiv2\pmod{7}\end{cases}\]解析首先我们考虑什么时候\(\equiv3\pmod{3}\),什么时候\(\equiv3\pmod{5}\),什么时候\(\equiv2\p

  7. java - 美国 map 的四色定理Java实现 - 2

    我正在尝试为每个状态分配一种颜色,以便没有两个相邻状态共享相同的颜色(http://en.wikipedia.org/wiki/Four_color_theorem)。该程序将输出每个状态及其颜色。我正在读取具有以下格式的48个状态(2个未连接)的文本文件:al,fl,ms,tn,gaar,la,tx,ok,mo,tn,msaz,ca,nv,ut,nmca,az,nv,orco,wy,ut,nm,ok,ks,ne...示例:阿拉巴马州与佛罗里达州、密西西比州、田纳西州和佐治亚州接壤。阿肯色州与路易斯安那州、德克萨斯州等接壤到目前为止,这是我的代码:MapColor.javaimport

  8. 离散数学 --- 图论基础 --- 子图和补图,握手定理 - 2

    第一部分---子图和补图1.生成子图:点集合不变,边集合是原图的边集合的子集2.导出子图:点集合是原图点集合的非空子集V,然后再在原图的边集合中找到两个端点均在点集合V中的边元素,并将这些边元素称成一个新的边集合,得到的这个边集合就是导出子图的边集合(点集合V和得到的新的边集合组成的新图是原图G的子图,被称为V导出的原图的子图,简称为V的导出子图)1.一个图G可以是自身的子图,生成子图和导出子图2.判断一个原图的子图是否是导出子图的方法:将子图中缺少的点在原图中删去,然后再将由于删去了点后少掉了一个端点的线给去掉,如果子图和这个修改后的原图相等的话,则这个子图就是原图的导出子图,否则就不是3.

  9. c++ - 分离轴定理: rotation around center of mass - 2

    问题出在Polygon::FindAxisLeastPenetration:doublePolygon::FindAxisLeastPenetration(unsignedint*faceIndex,constPolygon&polygonA,constPolygon&polygonB)const{doublebestDistance=-std::numeric_limits::infinity();unsignedintbestIndex;for(unsignedinti=0;iGetPosition());vertex.Subtract(polygonB.body->GetPosi

  10. AtCoder Beginner Contest 299 - 2

    A-TreasureChest(abc299a)题目大意给定一个包含|*.的字符串,其中|两个,*一个,问*是否在两个|之间。解题思路找到两个|的下标\(l,r\)以及*的下标\(mid\),看看是否满足\(l即可。神奇的代码#includeusingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);intn;strings;cin>>n>>s;intl=s.find('|'),r=s.find('|',l+1),m=s.find('*');if(m>l&

随机推荐