专栏文章

题解:P12876 [蓝桥杯 2025 国 Python A] 杨辉三角

P12876题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miouj9gt
此快照首次捕获于
2025/12/03 01:22
3 个月前
此快照最后确认于
2025/12/03 01:22
3 个月前
查看原文
提供一种简单的想法
杨辉三角
注意到红色这个圈内,数字单调递增,即 f(x)=(x1)f(x)={x \choose 1} 单调递增;蓝色这个圈内,数字单调也是递增,即 f(x)=(x+k1k)f(x)={x+k-1 \choose k} 单调递增。
因此可以先枚举红色再枚举蓝色,即先枚举将 ii22 开始枚举,再将 jjii 开始枚举,直到 (jji+1)>n{j \choose j-i+1}>n,具体可用 (jji+1)=jji+1(j1ji){j\choose j-i+1}=\frac{j}{j-i+1}{j-1\choose j-i} 递推计算。
这种方法快到飞起,n=5×107n=5\times 10^7 时也能在一秒内通过。
参考程序:
CPP
#include<iostream>
#define int long long
using namespace std;
const int N=1e5+10;
int f[N],vis[9];
signed main() {
	int n;
	cin>>n;
	for(int i=2;i<=n;++i)
		for(int j=i+1,tmp=i;tmp<=n;++j){
			++f[tmp];
			tmp=tmp*j/(j-i+1);
		}
	for(int i=2;i<=n;++i)++vis[f[i]];
	for(int i=1;i<=8;++i)if(vis[i])printf("%lld %lld\n",i,vis[i]);
}

时间复杂度

时间复杂度与每个数在杨辉三角中出现的次数有关。
n=109n=10^9 时可以达到如下表格:
出现次数个数
11
2999952655
315
447321
66
81
n=109n=10^9 内,大部分出现了 22 次,最多出现 88 次。
具体而言:
  1. 由于对称性,仅有 22 只出现 11 次;
  2. 形如 (p2)(p>3){p \choose 2}(p> 3)pp 为质数,出现过 44 次;
  3. 形如 (f2i+2f2i+31f2if2i+31)f_{2i+2}f_{2i+3}-1\choose f_{2i}f_{2i+3}-1,其中 f{f} 为斐波那契数列,出现过 66 次;
  4. 目前只发现了 30033003 出现过 88 次。
事实上有一个 Singmaster 猜想:杨辉三角中数出现的次数是 O(1)O(1) 的,即存在一个上界,目前发现出现最多为 88 次,而 Singmaster 认为这个答案是 10101212
1971 年,Singmaster 自己证明到了 O(logn)O(\log n)
1974 年,Abbott,Erdős,Hanson 三个人证明到了 O(lognloglogn)O(\frac{\log n}{\log\log n})
2007 年,Kane 证明到了 O((logn)(logloglogn)(loglogn)2)O(\frac{\left(\log n\right)\left(\log\log\log n\right)}{\left(\log\log n\right)^2})
若 Singmaster 猜想成立,则该算法的时间复杂度为 O(n)O(n)

评论

0 条评论,欢迎与作者交流。

正在加载评论...