uva 10254
如果我们设f[i]为4个柱子时把i个东东从一个柱子移到另一个柱子所用的最少步骤,设g[i]为3个柱子时对应的值,我们可以得到f[n]=min{2*f[k]+g[n-k]},其中g[i]是已知的为2^i-1。
然后接着就搞不下去了,看了别人报告说要找规律。有了上面的式子之后,我们打印前60个解还是很好打印的,同时把f[i]-f[i-1]也打印出来,这时会发现f[i]-f[i-1]都是2的某次方,而且2的k次方一共连续出现了k+1次,于是我们就可以以这个特征为依据预处理出所有解了
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int mod=;
struct Bignumber{
int V[];
int len;
void clear(){
memset(V,,sizeof(V));
len=;
}
Bignumber operator *( int od){
Bignumber ans;
ans.clear();
for(int i=; i<len; ++i){
ans.V[i]+=V[i]*od;
ans.V[i+]+=(ans.V[i])/mod;
ans.V[i]%=mod;
}
ans.len=len;
while(ans.V[ans.len]>){
ans.V[ans.len+]+=ans.V[ans.len]/mod;
ans.V[ans.len]%=mod;
ans.len++;
}
return ans;
}
Bignumber operator +( Bignumber od){
Bignumber ans;
ans.clear();
int L=max(len,od.len);
for(int i=; i<L; ++i){
ans.V[i]+=V[i]+od.V[i];
ans.V[i+]+=ans.V[i]/mod;
ans.V[i]%=mod;
}
ans.len=L;
while(ans.V[ans.len]>){
ans.V[ans.len+]+=ans.V[ans.len]/mod;
ans.V[ans.len]%=mod;
ans.len++;
}
return ans;
}
void print(){
printf("%d",V[len-]);
for(int i=len-; i>=; --i){
printf("%08d",V[i]);
}
// printf("\n");
}
}F[];
ll dp[];
ll f[];
int main()
{
Bignumber t;
t.V[]=;
t.len=;
F[].clear();
int num=,loc=;
while(loc<=){
for(int i=; i<num&&loc<=; ++i){
F[loc]=F[loc-]+t; loc++;
}
num++;
t=t*;
// t.print(); printf("\n");
}
int n;
while(scanf("%d",&n)==){
F[n].print();
printf("\n");
}
return ;
}
uva 10254的更多相关文章
- UVA 10254 十八 The Priest Mathematician
The Priest Mathematician Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu ...
- 递推+高精度+找规律 UVA 10254 The Priest Mathematician
题目传送门 /* 题意:汉诺塔问题变形,多了第四个盘子可以放前k个塔,然后n-k个是经典的汉诺塔问题,问最少操作次数 递推+高精度+找规律:f[k]表示前k放在第四个盘子,g[n-k]表示经典三个盘子 ...
- UVA 10254 - The Priest Mathematician (dp | 汉诺塔 | 找规律 | 大数)
本文出自 http://blog.csdn.net/shuangde800 题目点击打开链接 题意: 汉诺塔游戏请看 百度百科 正常的汉诺塔游戏是只有3个柱子,并且如果有n个圆盘,至少需要2^n- ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- UVA&&POJ离散概率与数学期望入门练习[4]
POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...
- UVA计数方法练习[3]
UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...
- UVA数学入门训练Round1[6]
UVA - 11388 GCD LCM 题意:输入g和l,找到a和b,gcd(a,b)=g,lacm(a,b)=l,a<b且a最小 g不能整除l时无解,否则一定g,l最小 #include &l ...
随机推荐
- Python 入门(五)条件判断和循环
if语句 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,可以用if语句实现: age = 20 if age > ...
- ZooKeeper(六)-- CAP和BASE理论、ZAB协议
一.CAP理论和BASE理论 1.CAP理论 CAP理论,指的是在一个分布式系统中,不可能同时满足Consistency(一致性). Availability(可用性).Partition toler ...
- VS添加命令行参数main(int argc, char** argv)
- Dotnet listview
属性----------------------------------------------------------------------------------------- .Access ...
- SDRAM容量的计算方法
当我在看有关SDRAM的芯片手册的时候,我一直在想这样一个问题:SDRAM的容量它究竟是如何计算的呢?经过查找网上的各种资料,最后在这里给大伙分享一下我的总结! 就以我的开发板的SDRAM的芯片手册的 ...
- js array.filter实例(数组去重)
语法: 循环对数组中的元素调用callback函数, 如果返回true 保留,如果返回false 过滤掉, 返回新数组,老数组不变 var new_array = source_array.filt ...
- 如何使用css影藏滚动条
1.单纯的一句代码: div ::-webkit-scrollbar {width: 0px;}//或者display:none 但是这代码最大的弊端就是只能在webkit内核的浏览器上进行显示,无法 ...
- 谈谈java中的构造函数
from 本篇博文主要是为新手.对java语言感兴趣的人和那些没有系统学习过java基础知识的人进行一个总结,在文章中对构造函数进行了较为详细的说明和讨论,也包含了我个人对于java面向对象中构造函数 ...
- MQTT-SN协议乱翻之实现要点
前言 本篇是MQTT-SN 1.2协议最后一篇翻译了,主要涉及实现要点,很简短. 需要支持QoS 值为 -1 QoS虽默认设置有0,1,2三个值,但还有一种情况其值为-1.来自客户端的PUBLISH消 ...
- Jenkins反序列化漏洞cve-2017-1000353
一.漏洞原理: 本地没有环境:参考:https://blogs.securiteam.com/index.php/archives/3171 进行学习理解记录. 首先这是一个java反序列化漏洞 ...