開啟章節選單

10190 Divide, But Not Quite Conquer!

題目連結

題目敘述

你的目標是在這題中,將一個整數 n 持續除以另一個整數 m,直到 n = 1,並得到一個數列。

我們把這個數列的每個數稱作 a[i],並假設這個數列總共有 k 個數(也就是說你必須進行 k - 1 次連續的除法才能讓 n 變成 1)。

你只有在滿足以下條件的情況下,才能建立這個數列:

  • a[1] = n,a[i] = a[i - 1] ÷ m,對於所有 1 ≤ i < k。
  • a[i] 可以被 m 整除(也就是 a[i] mod m = 0)對於所有 1 ≤ i < k。
  • a[1] > a[2] > a[3] > ... > a[k]。

輸入格式

輸入將包含任意多行。
每一行包含兩個非負整數 n 和 m,它們的數值都小於 2,000,000,000。
你必須讀取直到檔案結束(EOF)為止。

輸出格式

對於每一組 n 和 m,你必須輸出對應的數列 a(如前面所定義)在同一行上,數列中的相鄰數字之間以一個空格分隔。

如果該數列因違反某項限制而不存在,請輸出字串 'Boring!'(不含引號),並且只輸出這一行。

解題思路

先檢查兩數是否為1或0,再用while迴圈確認是否能整除至1。

程式碼

#include <bits/stdc++.h>

using namespace std;

#define ll long long int

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    vector<ll> ans;
    ll n,m,boring;
    while(cin>>n>>m){
        ans.clear();
        boring=0;
        if(n==0 || m==0 || n==1 || m==1){
            boring=1;
        }
        else{
            while(n>1){
                if(n%m!=0){
                    boring=1;
                    break;
                }
                else{
                    ans.push_back(n);
                    n=n/m;
                }
            }
        }
        if(boring==1){
            cout<<"Boring!"<<'\n';
        }
        else{
            ans.push_back(1);
            for(auto i:ans){
                if(i==1){
                    cout<<i<<'\n';
                }
                else{
                   cout<<i<<' '; 
                }
            }
        }
    }
}