试题:
如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1,
给定一个正整数 NN,请你输出数列中第一次出现 NN 是在第几个数?
思路:
组合数+二分法
解答过程:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, res;ll cal(ll m, ll nn)
{ll num = 1;for(ll i = nn, j = 1; j <= m; i--, j++){num = num * i / j;if(num > n)return num;}return num;
}bool check(ll i)
{ll left = 2*i;ll right = max(left, n);ll mid;while(left <= right){mid = (left + right) / 2;ll t = cal(i, mid);if(t == n){res = (mid+1)*mid/2 + i+1;cout << res << endl;return true;}else if(t > n)right = mid - 1;elseleft = mid + 1;}return false;
}int main()
{cin >> n;for(ll i = 16; ; i--){if(check(i))break;}return 0;
}