http://codeforces.com/gym/100801/attachments

题意:给出一个数n(1 <= n <= 1e18),将 n 拆成 m 个整数,其中 m 必须是 2^x * 3^y 的形式,并且 x 和 y 不能被彼此整除, 输出 m 并将这些整数输出。

思路:Inspired by http://blog.csdn.net/snowy_smile/article/details/49852091 。

第一步:因为要求的 m 是 2^x * 3^y 的形式,所以如果 n 可以直接被 2^x * 3^y 整除的话,即 n % (2^x * 3^y) == 0,那么就可以直接输出 n 了。如果不能被直接整除的话,我们可以先将 n 拆解成不能被 3 和 2 整除的形式,这里的话用一个 mul 记录 n 除以多少。

     while(n %  == ) {
n /= ;
mul *= ;
}
while(n % == ) {
n /= ;
mul *= ;
}
if(n == ) {
num[m++] = mul;
return ;
}

第二步:那么更重要的问题是如果 n 不能被 2 或 3 整除,同时也不为 1 时应该怎么做。因为不能被 2 整除,所以这时的 n 必定是一个奇数。那么我们可以将 n 减去 w,w = 3^y && w < n,我们所做的是将 n 拆解出一个 w(w必定为奇数),那么剩下的 n 就是一个偶数了,这个时候我们又能回到第一步进行递归求解了。因为我们拆出的 w  也是组成 n 的一部分,因此要记录下来,记录的数值是 w * mul,因为我们前面 n 除以了 一些 2 和 3 ,我们用 mul 记录下来了,因此这个时候要乘回去,所以是 w * mul。

 else {
long long x = ;
while(x * < n) {
x *= ;
}
n -= x;
num[m++] = x * mul;
solve(n, mul);
}
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
#include <cstdlib>
using namespace std;
typedef long long LL;
LL num[];
int m;
/*
题意:将n拆成m个数,这m个数的表示是
*/
void solve(LL n, LL mul)
{
while(n % == ) {
n /= ;
mul *= ;
}
while(n % == ) {
n /= ;
mul *= ;
}
if(n == ) {
num[m++] = mul;
return ;
} else {
long long x = ;
while(x * < n) {
x *= ;
}
n -= x;
num[m++] = x * mul;
solve(n, mul);
}
} int main()
{
freopen("distribution.in", "r", stdin);
freopen("distribution.out", "w", stdout);
int t;
cin >> t;
while(t--) {
LL n;
cin >> n;
m = ;
solve(n, );
cout << m << endl;
for(int i = ; i < m; i++) {
cout << num[i];
if(i != m-) cout << " ";
else cout << endl;
}
}
return ;
}

最新文章

  1. 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
  2. Binary Tree Zigzag Level Order Traversal [LeetCode]
  3. Geodatabase数据模型
  4. Javascript数组方法(译)
  5. MSSQL Server Transaction 数据库事务回滚的用法
  6. Heritrix源码分析(二) 配置文件order.xml介绍(转)
  7. 实现简单的cp命令
  8. apply()与call()的区别
  9. 细说PHP优化那些事
  10. 对每个用户说hello
  11. Nohttp网络请求数据,Post以及Get的简单实用以及设置缓存文字的的请求
  12. Oracle数据库查询优化方案(处理上百万级记录如何提高处理查询速度)
  13. css 颜色表示法
  14. Java学习--泛型
  15. HotSpot 虚拟机对象揭秘【转载】
  16. shell find
  17. URL Resources
  18. $(&quot;#form1&quot;). serialize()提交表单
  19. 上产使用MQ的三点注意
  20. java跨域解决

热门文章

  1. DataTemplate
  2. wpf border内部元素内边角溢出问题 裁剪效果
  3. js onload事件使用
  4. C++中构造函数能调用虚函数吗?(答案是语法可以,输出错误),但Java里居然可以
  5. huawei 通过BGP的团体属性进行路由控制
  6. 管道通信实例(A程序作为服务器,不断从B程序接收数据,并发送到C程序中)
  7. 【Qt】无边框窗体中带有ActiveX组件时的一个BUG
  8. Qt 5.6.0 动态编译(VS2013 x86 target xp openssl icu webkit)
  9. Hadoop 3、Hadoop 分布式存储系统 HDFS(好多彩色图)
  10. 写一个可拖动的 TShape(简单有效:依靠VCL体系,TShape自己就能被探测到被点击了,然后只要改变Left坐标就行了)