P3048 [USACO12FEB]Cow IDs S

FJ使用二进制为奶牛编号,每个编号含K个1且1开头。求第N个编号。通过从后往前枚举,发现第i位为1的情况数为C(i-1, k)。预处理组合数,暴力求解。特殊情况:k=1时,答案为全1的串,长度为N。" 114575825,10297094,Java PDF转图片工具类实现,"['Java开发', 'PDF处理', '图像处理']
摘要由CSDN通过智能技术生成

题意

FJ给他的奶牛用二进制进行编号,每个编号恰好包含K 个"1" (1 <= K <= 10),且必须是1开头。FJ按升序编号,第一个编号是由K个"1"组成。

请问第N(1 <= N <= 10^7)个编号是什么。

首先手动模拟样例,发现如果从后往前枚举,当第i位为1后面总的情况都是C(i-1,k),k为当前1个数,每确定一个1,k都会减小。
那么不就剩暴力了吗,预处理组合数,k只需要10个,所以底数即使开1e6个都是够的,也不要怕爆int,因为能爆int得数我们不可能取,所以爆int的数为负数,我们一个简单判断就可以剔除。唯独k为1的情况我们特别考虑,因为1的时候答案是固定的,长度必为n,而n可能是1e7,我们直接输出即可,k越大,最后长度越短。

//
// Created by SANZONG on 2021/8/9.
//

#include "bits/stdc++.h"

#define int long long
using namespace std;
const int mod = 1e9 + 7;
const int N = 2e6;
const int MAXN = 3e5 + 100;
int c[MAXN][
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值