zoukankan      html  css  js  c++  java
  • Gym 100801D Distribution in Metagonia(构造)

    题意:

    给你一个LL的数,让你把它分解为许多个数相加的形式,

    要求这些数的质因子只有2和3并且这些数的因子2的个数和因子3的个数不能同时小于等于其他任意一个数

    要求这些数的数量不超过100个

    思路:

    递归构造,如果当前数正好符合条件就终止,否则先让他把2和3尽可能的除去,并乘在tmp中作为公因子,

    然后提取出小于他的最大的3的次方数,保证这个数的3的因子数最大,对于剩下的这个数再进行dfs递归直到刚好符合条件跳出

    这样保证所有的数是按3的次方递减的,符合条件

    /* ***********************************************
    Author        :devil
    ************************************************ */
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <stack>
    #include <map>
    #include <string>
    #include <time.h>
    #include <cmath>
    #include <stdlib.h>
    #define LL long long
    #define rep(i,a,b) for(int i=a;i<=b;i++)
    #define dep(i,a,b) for(int i=a;i>=b;i--)
    #define ou(a) printf("%d
    ",a)
    #define pb push_back
    #define mkp make_pair
    template<class T>inline void rd(T &x)
    {
        char c=getchar();
        x=0;
        while(!isdigit(c))c=getchar();
        while(isdigit(c))
        {
            x=x*10+c-'0';
            c=getchar();
        }
    }
    #define IN freopen("in.txt","r",stdin);
    #define OUT freopen("out.txt","w",stdout);
    using namespace std;
    const int inf=0x3f3f3f3f;
    const int mod=1e9+7;
    const int N=1e2+10;
    LL ans[N],f[42],n;
    int t,cnt;
    void dfs(LL tmp,LL u)
    {
        while(u%2==0){u/=2;tmp*=2;}
        while(u%3==0){u/=3;tmp*=3;}
        if(u==1){ans[cnt++]=tmp;return;}
        int p=upper_bound(f,f+40,u)-f-1;
        ans[cnt++]=f[p]*tmp;
        dfs(tmp,u-f[p]);
    }
    int main()
    {
    #ifndef ONLINE_JUDGE
    //IN
    #endif
        freopen("distribution.in","r",stdin);
        freopen("distribution.out","w",stdout);
        f[0]=1;
        for(int i=1;i<=39;i++) f[i]=f[i-1]*3;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%lld",&n);
            cnt=0;
            dfs(1,n);
            printf("%d
    ",cnt);
            for(int i=0;i<cnt;i++) printf("%lld%c",ans[i],i==cnt-1?'
    ':' ');
        }
        return 0;
    }
  • 相关阅读:
    Asp.net MVC routing 路由
    Asp.net MVC3 企业网站系统高仿博客园 首页左侧列表页面 实现效果
    Asp.net MVC 3 开发简单的企业系统开篇数据库
    Asp.net MVC 3 开发企业网站系统仿照博客园部分功能总体设计
    [转]C语言中的文件格式化读写函数:fprintf和fscanf
    如何讀取/寫入文字檔? (IC Design) (Verilog)
    Verilog状态机的编写学习
    [转] verilog中的integer和reg的差别
    verilog常用系统函数以及例子
    独立写testbench注意的几点
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/6020026.html
Copyright © 2011-2022 走看看