在SPOJ AP3中获得错误的答案(AP - 完整系列)?

时间:2014-06-27 16:13:42

标签: c++ optimization

我在SPOJ上遇到了问题,here

我做了数学计算,最后编码了solution

我在ideone上做对了,但SPOJ拒绝了我的答案为“WA”。

#include <iostream>
#include <cmath>
typedef long long LL;

using namespace std;

int main() {

        LL t,x,y,sum,d,n,cd,a,i;

        cin>>t;

    while(t--)
    {
        cin >> x >> y >> sum;
        d = 5*y + 7*x + 2*sum;

        n = (d + sqrt(d*d - 48*sum*(x+y)))/(2*(x+y));

        cd = ( y - x )/(n-6);

        a = x - 2 * cd;

        cout<<n<<endl;
        for(i=0;i<n;i++) {
            cout<< a + cd * i<<" ";
        }
        cout<<endl;
    }
    return 0;
}
  

输入:

     

3

     

3 7 55

     

8 11 77

     

9 17 120

     

输出:

     

10

     

1 2 3 4 5 6 7 8 9 10

     

7

     

2 5 8 11 14 17 20

     

8

     

1 5 9 13 17 21 25 29

我在哪里弄错了。我认为问题可能是精确度,但我无法检查。我错了数据类型或使用的精度还是需要一些I / O优化?输入[5 1 25]有效吗?因为它给出的输出为[7 6 5 4 3 2 1 0 -1 -2]

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

希望我不会太晚..有些precision loss就像你必须先在long double中回答你的答案,然后使用long long int将其转换为llrint()类型function..i直到现在还没有解决这个问题,因为我的数学计算没有产生正确的结果..我只使用你的代码来检查结果并得到AC ..这里是代码

#include <iostream>
#include <cmath>

typedef long long int LL;

using namespace std;

int main() {

        LL t,x,y,sum,i,a,tointeger,newdiff;
        long double n,cd,d;

        cin>>t;

        while(t--) {
            cin >> x >> y >> sum;
            d = 5.0 * y + 7.0 * x + 2.0 * sum;

            n = (d + sqrt(d * d - 48.0 * sum * (x + y))) / (2.0 * (x + y));
            tointeger = llrint(n);

            cd = (y - x) / (tointeger - 6.0);
            newdiff = llrint(cd);
            a = x - 2 * newdiff;
            cout<<tointeger<<endl;

            for(i=0;i<tointeger;i++) {
                cout<< a + newdiff * i<<" ";
            }
            cout<<endl;
    }
    return 0;
}