这题的我的解题思路是参考的这个题主的大家可以先看一下
求杨辉三角中元素首次出现位置【2021蓝桥杯】
首先这题暴力题解肯定是有数据点过不了的,所以还是老老实实的用这个题主的算法吧。
在理解了,题主的算法的基础上,c++写起来有以下几个坑点绝对不是因为我菜
32 30的阶乘会超过long long 的数据范围,不能直接算阶乘用一次算一次,会超时,但 M == 1 时直接出答案,不然也会超时1要特判
就这么多吧 直接上代码
#includeusing namespace std; long long n1, a = 16, x=0, k = 0;//k判断是否找到 a就是Cmn里面的n 就是第几斜 long long fac(int m){ long long s=1,mn = m - a,z = 1; for(int i = m; i > a;i--){ s *= i; while(z <= m-a){//防止数据范围超了 s /= z++; break; } } return s; } int main(){ cin>>n1;//输入的数 if(n1 == 1){//特判 cout<<1; return 0; } else{ while(!k && a != 1){//找到n1直接跳出循环 for(int i = 2 * a; ;i++){//从32开始循环 倒序 if(i == 2 * a)//每次底变化算一次阶乘 x = fac(i); else x = x*i/(i-a);//维护一个区间 减少计算 if(x == n1){//找到了 跳出去 k = i; break; }else if(x > n1){//这个斜里面没有 a--找下一个斜 a--; break; } } } } if(a == 1)//第一斜不特判有俩个数据点过不了 cout<



