跳到主要内容
0%
约 2 分钟

CSP 202209-1 如此编码 C++ 100


题目

【题目描述】 己知某次测验包含n道单项选择题,其中第i题(1≤i≤n)有ai个选项,正确选项为bi,满足ai≥2且 0≤bi<ai。比如说,ai=4表示第i题有4个选项,此时正确选项bi,的取值一定是0、1、2、3其中之一。 顿顿老师设计了如下方式对正确答案进行编码,使得仅用一个整数m便可表示b1,b2,···,bn 首先定义一个辅助数组ci,表示数组ai的前缀乘积。当1≤i≤n时,满足:

$C_i=a_1×a_2×···×a_i$

特别地,定义c0=1。 于是 m 便可按照如下公式算出:

$m=\sum_{i=1}^{n}c_i×b_i\ =c_0b_1+c_1b_2+···+c_{n-1}b_n$ 易知,0≤m<cn,最小值和最大值分别当bi全部为0和bi=ai-1时取得。 试帮助小P同学,把测验的正确答案b1,b2,···,bn从顿顿老师留下的神秘整数m中恢复出来。

【输入格式】 从标准输入读入数据。 输入共两行。 第一行包含用空格分隔的两个整数n和m,分别表示题目数量和顿顿老师的神秘数字。 第二行包含用空格分隔的n个整数a1,a2,···,an,依次表示每道选择题的选项数目。

【输出格式】 输出到标准输出。 输出仅一行,包含用空格分隔的n个整数b1,b2,···,bn,依次表示每道选择题的正确选项。 【样例输入】

15 32767
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

【样例输出】

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

代码

#include <bits/stdc++.h>

using namespace std;
using ll=long long;
const ll N=100;

int main()
{
    ll n,m;
    ll c[N];
    ll a,t;
    cin>>n>>m;
    c[0]=1;
    for(ll i=1;i<=n;i++)
    {
        cin>>a;
        c[i]=c[i-1]*a;
    }

    for(ll i=1;i<=n;i++)
    {
        t=m%c[i]-m%c[i-1];
        cout<<t/c[i-1]<<' ';
    }

    return 0;
}

向 AI 提问(基于本文内容)

评论