嘘~ 正在从服务器偷取页面 . . .

AcWing4699 如此编码 题解


AcWing4699 如此编码 题解

题目链接:AcWing4699 如此编码

题意

给定长度为 $n$ 的数组 $a_i$ 和 $m$ ,求 $b_i$ ,其中 $m$ 的定义如下:

记 $c_i = \prod_{j = 1}^{i}a_i$ ,定义 $c_0=1$ ,则 $m = \sum_{i = 1}^{n} c_{i-1}\times b_i$

输入格式

第一行给出 $n,m$ ,第二行给出 $a_i$ 。

输出格式

一行,$n$ 个数,表示 $b_i$ 。

数据范围

$1\le n\le 20,~a_i\ge 2,~0\le b_i\le a_i,~ c_n \le 10^9$

把 $m$ 的定义式展开

可以发现,当所有 $a_i$ 相等时,这就是一个 $a_i$ 进制的数。

因此我们从进制的角度出发。因为 $b_i < a_i$ ,所以我们可以直接用 $m \bmod a_1$ 求出 $b_1$

同理, $b_2 = \left\lfloor\frac{m}{a_1}\right\rfloor \bmod a_2$ 。那么我们只要循环就能求出 $b_2$ 了。

时间复杂度 $\mathcal{O}(n)$

代码:(有点过于短了

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
void up(int &x,int y) { x < y ? x = y : 0; }
void down(int &x,int y) { x > y ? x = y : 0; }
#define N ((int)(25))

int n,m,a[N];
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    // freopen("check.in","r",stdin);
    // freopen("check.out","w",stdout);
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= n; m /= a[i++])
        cout << m % a[i] << " \n"[i == n]; 
    return 0;
}

文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录