问题陈述
查找 介于 和(包括)之间不是 或 的倍数的整数之和。11NNAABB
约束
- 1≤N,A,B≤109
- 输入中的所有值都是整数。
输入
输入从标准输入中按以下格式给出:
N A B
输出
打印答案。
示例 1
输入复制 输出复制 10 3 5 22和(非)之间的整数,不是 或 的倍数,且和 和 的整数,其和为 。11101033551,2,4,71,2,4,7881+2+4+7+8 =221+2+4+7+8=22
示例 2
输入复制 输出复制 1000000000 314 159 495273003954006262
人麻了,这题不难,当时时间不够了,唉。
略微暴力:
#include<iostream>
using namespace std;
int gcd(int a, int b)
{
if (a < b)
{
swap(a, b);
}
if (b == 0)
{
return a;
}
return gcd(b, a % b);
}
int main()
{
long long int n,a,b;
scanf("%lld %lld %lld", &n,&a,&b);
long long int sum = 0,sum1=0,sum2=0,sum3=0;
sum = (n + 1) * n / 2;
for (int i = 1; i <= n / a; i++)
sum -= i*a;
for (int i = 1; i <= n / b; i++)
sum -= i * b;
long long int k = a*b/gcd(a, b);
for (int i = 1; i <= n / k; i++)
sum += i *k;
printf("%lld", sum);
}
有的编译器不支持:
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <cstring>
#include <map>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
ll n,a,b;
scanf("%lld %lld %lld",&n,&a,&b);
ll sum=(n+1)*n/2;
ll k=n/a;
sum-=(k+1)*k/2*a;
if(a!=b){
ll k=n/b;
sum-=(k+1)*k/2*b;
k=n/(a/(__gcd(a,b))*b);
sum+=(k+1)*k/2*(a/(__gcd(a,b))*b);;
}
printf("%lld",sum);
return 0;
}