这道题按理来说需要分类讨论的(向上数或向下数)
但是数据中似乎只有向上数的测试点
导致用下面这段错误的代码也可以过
#include <iostream>
#include <cmath>
#define tiny 0.0000001
using namespace std;
double solve(double a, double b, double c){
return (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
}
int sum(int n){
return (n * n + n) / 2;
}
int row(int n){
return ceil(solve(0.5, 0.5, -n) - tiny);
}
int main(){
int N;
cin >> N;
cout << row(N) + 1 - N + sum(row(N) - 1) << '/' << N - sum(row(N) - 1);
}
正确做法AC Code(注意main()函数最后几行的差别):
#include <iostream>
#include <cmath>
#define tiny 0.0000001
using namespace std;
double solve(double a, double b, double c){
return (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
}
int sum(int n){
return (n * n + n) / 2;
}
int row(int n){
return ceil(solve(0.5, 0.5, -n) - tiny);
}
int main(){
int N;
cin >> N;
if(row(N) % 2)
cout << row(N) + 1 - N + sum(row(N) - 1) << '/' << N - sum(row(N) - 1);
else
cout << N - sum(row(N) - 1) << '/' << row(N) + 1 - N + sum(row(N) - 1);
}