赛场上竟然只有我写了数学做法,大家做法都是 O(klgn)O(klgn) 极其更劣的,而且占用空间高,那么我们说一下 O(k+lgn)O(k+lgn) 做法 my submission

我们考虑枚举每一位,并且假设前面的位置已经保持原来大数不变,那么这里还需要放的数已经确定好了。

如果某一位原数不是 00 那么放小于这个数的后面的数字就可以随便放 $(w_i-1)\times \binom{n-i}{k-cnt-1}\times 9^{k-cnt-1} + \binom{n-i}{k-cnt}\times 9^{k-cnt}$。

cnt表示前面非0数,i表示当前位置。

最后 cnt=kcnt=k++ans++ans,表示到目前为止后面都填 00 就行并 breakbreak

贴一下部分代码

if(x[i]!='0')ans+=(x[i]-'0'-1)*C(n-i-1,k-cnt-1)*pow(9,k-cnt-1);
	if(x[i]!='0')ans+=C(n-i-1,k-cnt)*pow(9,k-cnt);
	if(x[i]!='0')cnt++;
	if(cnt==k){
		ans++;
		break;
	}

于是我决定出一个加强版预计数据范围n10106,k106,mod=109+7n\le 10^{10^6},k\le 10^6,mod=10^9+7

加强版链接

2 条评论

  • @ 2024-1-29 11:54:34

    %%%

    • @ 2023-10-14 8:52:30

      题外话,我们决定将 SYTAKIOISYTAKIOI 冲到威海rank1,有没有刷题的来报名(考虑目前只有比赛分,题目分很低)。

    • 1

    信息

    ID
    2499
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    206
    已通过
    24
    上传者