因此可以先枚举红色再枚举蓝色,即先枚举将 i 从 2 开始枚举,再将 j 从 i 开始枚举,直到 {j \choose j-i+1}>n,具体可用 {j\choose j-i+1}=\frac{j}{j-i+1}{j-1\choose j-i} 递推计算。
这种方法快到飞起,n=5\times 10^7 时也能在一秒内通过。
参考程序:
#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]);
}