题目背景
某次测验后,顿顿老师在黑板上留下了一串数字 23333 便飘然而去。凝望着这个神秘数字,小 P 同学不禁陷入了沉思......
题目描述
已知某次测验包含 n 道单项选择题,其中第 i 题(1≤i≤n)有 个选项,正确选项为 ,满足。比如说,=4 表示第 i 题有 4 个选项,此时正确选项 的取值一定是 0、1、2、3 其中之一。
顿顿老师设计了如下方式对正确答案进行编码,使得仅用一个整数 m 便可表示
首先定义一个辅助数组 ,表示数组 的前缀乘积。当 1≤i≤n 时,满足:
特别地,定义 c0=1。
于是 m 便可按照如下公式算出:
易知,,最小值和最大值分别当 全部为 0 和 =−1 时取得
试帮助小 P 同学,把测验的正确答案 从顿顿老师留下的神秘整数 m 中恢复出来。
输入格式
从标准输入读入数据。
输入共两行。
第一行包含用空格分隔的两个整数 n 和 m,分别表示题目数量和顿顿老师的神秘数字。
第二行包含用空格分隔的 n 个整数,依次表示每道选择题的选项数目。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
long long int n,m;
cin>>n>>m;
vector<long long int>a(n+1,0);
vector<long long int>ans(n,0);
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
if(m==0)
{
for(int i=0;i<n;i++)
{
cout<<0<<" ";
}
}
else
{
vector<long long int>c(n+1,0);
c[0]=1;
for(int i=1;i<=n;i++)
{
c[i]=c[i-1]*a[i];
}
for(int i=0;i<n;i++)
{
if(i==0)
{
ans[i]=(m%c[1])/c[0];
}
else
{
ans[i]=(m%c[i+1]-m%c[i])/c[i];
}
}
for(int i=0;i<n;i++)
{
cout<<ans[i]<<" ";
}
}
return 0;
}