费了大劲总结规律让程序免受穷举之困,过了几个样本之后, 万万没想到,居然栽数据类型上了,第一个点就来个10^18, 我第一次提交用的long long储存结果,在电脑上运行输出是对的,但提交到了oj,输出的结果就错了,少了约4*10^17, long long 用不了我就改用double, 但这样又会因为自动取整失效而答案在个位数出现差别, 最后我只能给每个除法操作手动floor向下取整,才通过了。。。 (^ ワ^|||)
不会爆long long呀
#include <iostream>
#include <cstdio>
using namespace std;
#define LL long long
int main(){
LL n; cin>>n;
LL a,b,c,d; cin>>a>>b>>c>>d;
LL cnt=0;
cnt+=n/a+n/b+n/c+n/d;
cnt-=n/(a*b)+n/(a*c)+n/(a*d)+n/(b*c)+n/(b*d)+n/(c*d);
cnt+=n/(a*b*c)+n/(a*b*d)+n/(b*c*d)+n/(a*c*d);
cnt-=n/(a*b*c*d);
cout<<cnt;
return 0;
}
我用的是c。。。c++我不知道 `
#include <stdio.h>
#include <math.h>
int main(){
double n;
double a, b, c, d;
double sum=0;
scanf("%lf", &n);
scanf("%lf%lf%lf%lf", &a, &b, &c, &d);
sum = floor(n/a)+floor(n/b)+floor(n/c)+floor(n/d);
if(n>a*b)
sum -= floor(n/(a*b)) - floor(n/(a*c)) - floor(n/(a*d)) - floor(n/(b*c)) - floor(n/(b*d)) - floor(n/(c*d)) ;
if(n>a*b*c)
sum += floor(n/(a*b*c)) + floor(n/(a*b*d)) + floor(n/(a*c*d)) + floor(n/(b*c*d));
if(n>a*b*c*d)
sum -= floor(n/(a*b*c*d));
printf("%.0lf", sum);
return 0;
}
`
没有问题噢,按照你的代码改改,估计是你除以两个数的乘积那一步弄错了,要 -= x + x1 +x2这样
#include <stdio.h>
#include <math.h>
#define ll long long
int main(){
ll n;
ll a, b, c, d;
ll sum=0;
scanf("%lld", &n);
scanf("%lld %lld %lld %lld", &a, &b, &c, &d);
sum = (n/a)+(n/b)+(n/c)+(n/d);
sum -= (n/(a*b)) + (n/(a*c)) + (n/(a*d)) + (n/(b*c)) + (n/(b*d)) + (n/(c*d)) ;
sum += (n/(a*b*c)) + (n/(a*b*d)) + (n/(a*c*d)) + (n/(b*c*d));
sum -= (n/(a*b*c*d));
printf("%lld", sum);
return 0;
}
擦,抱歉,这份代码不是我提交的那份,是之前存在手机上的错误代码,那句少了一对括号,当时看到回复电脑又不在身边就用那份代码加个floor就发出来了……
事实上我的代码跟你的差不多,在自己电脑上运行是正确的,也能在数字较小的情况下有正确输出,用第一个点的数据也没出错。但提交到oj第一个点就错了。