1. 程式人生 > >Codeforces Round #514 (Div. 2) C.Sequence Transformation(找規律)

Codeforces Round #514 (Div. 2) C.Sequence Transformation(找規律)

題意:給定一個數字,找從1到n這n個數字的最大公約數,然後從這n個數字中去掉一個數字,使得去掉之後剩下的n-1個數字的最大公約數能比之前的大,每次都去掉一個數字,使得最大公約數能夠最快的上升。

思路:列出1到9的答案:1:1,2:12,3:113,4:1124,5:11124,6:111226,7:1111226,8:11112248,9:111112248。排除3,6,7,容易發現,1的個數是n/2向上取整,2的個數是n/2/2。所以可以每一次讓n/2,如果最後是3,那麼就

輸出ans ans ans*3。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=200005;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    std::ios::sync_with_stdio(false);
    int n;
    while(cin>>n)
    {
        int ans=1;
        while(n)
        {
            if(n==3)
            {
                cout<<ans<<" "<<ans<<" "<<ans*3<<endl;
                break;
            }
            else
            {
                for(int i=0;i<(n+1)/2;i++)
                {
                    cout<<ans<<" ";
                }
                if(n/2==0)
                    cout<<endl;
            }
            ans*=2;
            n/=2;
        }
    }
    return 0;
}