我只能说是oj系统的问题

Hyper Chordfish 发表于 3年前 · 关联问题 简单的 RC 签到题

费了大劲总结规律让程序免受穷举之困,过了几个样本之后, 万万没想到,居然栽数据类型上了,第一个点就来个10^18, 我第一次提交用的long long储存结果,在电脑上运行输出是对的,但提交到了oj,输出的结果就错了,少了约4*10^17, long long 用不了我就改用double, 但这样又会因为自动取整失效而答案在个位数出现差别, 最后我只能给每个除法操作手动floor向下取整,才通过了。。。 (^ ワ^|||)

TMLWACRE 发表于 3年前

不会爆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; }

Hyper Chordfish 发表于 3年前

我用的是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; }

`

黄一肯 发表于 3年前

没有问题噢,按照你的代码改改,估计是你除以两个数的乘积那一步弄错了,要 -= 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; }

Hyper Chordfish 发表于 3年前

擦,抱歉,这份代码不是我提交的那份,是之前存在手机上的错误代码,那句少了一对括号,当时看到回复电脑又不在身边就用那份代码加个floor就发出来了……

事实上我的代码跟你的差不多,在自己电脑上运行是正确的,也能在数字较小的情况下有正确输出,用第一个点的数据也没出错。但提交到oj第一个点就错了。