hihocoder第226周:打表找规律
问题描述
有一个文本框,可以执行以下操作:
- 输入A
- Ctrl+C 复制
- Ctrl+V 粘贴
- Ctrl+A 全选
N次操作最多能够造出多少个A来?
输入一个N,输出一个整数,表示最多有多少个A。因为输出结果太大,需要模上1e9+7。
暴力方法
定义一个Node,use表示操作次数,count表示当前的A的个数,paste表示粘贴板上的A的个数。
class Node {
int use;
int count;
int paste;
Node(int use, int count, int paste) {
this.use = use;
this.count = count;
this.paste = paste;
}
}
使用优先队列,按照use从小到大进行扩展。对于每个结点,根据use和count更新状态。
复杂度极高,只能求到20左右。
动态规划方法
思考四种操作之间的关系,可以发现以下贪心法则:
- ctrl+A,ctrl+C,ctrl+V必然是一气呵成的
- 只要剪贴板上有东西,就不可能直接输入A。直接输入A只能获取一个字符,ctrl+V则可以获取至少一个。
定义f[n]表示n个操作的最大长度,只需要假设最后一次操作为i(i<n-2),那么f[n]=f[i]*(n-i-1),表示执行n-i-1次粘贴操作。使用last[n]表示n个操作的上次复制时机。打表很容易发现规律。
对于n<16,没有明确规律。
对于n>=16,f[n]=f[n-5]*4
找到了规律,就很容易通过计算的方式求解了。
数学方法
import java.util.Scanner;
public class Main {
long mod = 1000000007;
long[] a = new long[100];
int[] last = new int[a.length];
long pow(long x, int y) {
if (y == 0) return 1;
if (y == 1) return x;
long z = pow(x, y / 2);
if (y % 2 == 0) {
return z * z % mod;
} else {
return z * z * x % mod;
}
}
long solve(int x) {
if (x <= 16) return a[x];
int power = (x - 11) / 5;
int which = (x - 11) % 5;
long ans = a[11 + which] * pow(4, power) % mod;
return ans;
}
Main() {
Scanner cin = new Scanner(System.in);
int x = cin.nextInt();
for (int i = 0; i < 6; i++) {
a[i] = i;
}
for (int i = 6; i <= 16; i++) {
for (int j = 1; j < i - 2; j++) {
long now = a[j] * (i - 1 - j);
if (now > a[i]) {
a[i] = now;
last[i] = j;
}
}
}
System.out.println(solve(x));
}
public static void main(String[] args) {
new Main();
}
}
总结
一直以来,数学中最奇妙的东西都是像这道题所体现出来的那样。
在数据较小的时候毫无规律,当数据达到一定程度之后,规律突然“冒”出来了。
这是最神奇的事物。这是这道题第一个有趣的地方。
第二个有趣的地方是,简单的定义引出复杂的结论。
这道题非常切合实际,大部分程序员在某个瞬间应该都闪念过这个问题,但是没有深究。谁能想到简单的题设背后蕴含着如此复杂精致的规律。
hihocoder第226周:打表找规律的更多相关文章
- hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)
Nim or not Nim? Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Sub ...
- HDU 5753 Permutation Bo (推导 or 打表找规律)
Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...
- HDU 4861 Couple doubi (数论 or 打表找规律)
Couple doubi 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/D Description DouBiXp has a ...
- HDU2149-Good Luck in CET-4 Everybody!(博弈,打表找规律)
Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- 【ZOJ】3785 What day is that day? ——浅谈KMP在ACM竞赛中的暴力打表找规律中的应用
转载请声明出处:http://www.cnblogs.com/kevince/p/3887827.html ——By Kevince 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这 ...
- HDU 5795 A Simple Nim(SG打表找规律)
SG打表找规律 HDU 5795 题目连接 #include<iostream> #include<cstdio> #include<cmath> #include ...
- hdu_5894_hannnnah_j’s Biological Test(打表找规律)
题目链接:hdu_5894_hannnnah_j’s Biological Test 题意: 有n个不同的位置围成一个圈,现在要安排m个人坐,每个人至少的间隔为k,问有多少种安排 题解: 先打表找规律 ...
- hdu_5795_A Simple Nim(打表找规律的博弈)
题目链接:hdu_5795_A Simple Nim 题意: 有N堆石子,你可以取每堆的1-m个,也可以将这堆石子分成3堆,问你先手输还是赢 题解: 打表找规律可得: sg[0]=0 当x=8k+7时 ...
- hdu_5793_A Boring Question(打表找规律)
题目链接:hdu_5793_A Boring Question 题意: 自己看吧,说不清楚了. 题解: 打表找规律 #include<cstdio> typedef long long l ...
- hdu 3032 Nim or not Nim? (sg函数打表找规律)
题意:有N堆石子,每堆有s[i]个,Alice和Bob两人轮流取石子,可以从一堆中取任意多的石子,也可以把一堆石子分成两小堆 Alice先取,问谁能获胜 思路:首先观察这道题的数据范围 1 ≤ N ...
随机推荐
- ListPopupWindow 列表弹窗 常见弹窗区别
案例 private void showPopupWindow(final Context context, @NonNull View anchorView) { final String[] po ...
- Android -- Serializable和Parcelable需要注意的
Serializable 静态变量序列化不会被保存 public class Test implements Serializable { private static final long seri ...
- java根据图片路径下载到服务器方案 (转)
http://www.cnblogs.com/thinkingandworkinghard/articles/5589484.html 平常做的工作中,有一部分是同步数据的.但是同步的过程中碰到个问题 ...
- linux ps 命令的查看
linux ps 命令的结果中VSZ,RSS,STAT的含义和大小 ps是linux系统的进程管理工具,相当于windows中的资源管理器的一部分功能. 一般来说,ps aux命令执行结果的几个列的信 ...
- Google Java Style 中文版
Google Java Style 中文版 基于官方文档2013.12.19最后一次改动. 翻译人:Weir Zhang (zh.weir) 旁白:水平有限,很多地方只是意译.不准确的地方 ...
- linux ifconfig -a
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/i686-pc ...
- asp.net使用include包含文件
么?用asp.net使用include包含文件?……有必要吗?使用“用户控件”不是更好吗? 当然,绝大多数情况下,用户控件都能解决问题.但若要在用户控件中需包含其他公用块,即使用用户控件嵌套,老是出问 ...
- FIS.js前端开发的使用说明文档
文档结构 什么是FIS 部署FIS FIS基本使用 模块定义 加载方式 调用Tangram 2.0 一.什么是FIS FIS提供了一套贯穿开发流程的开发体系和集成开发环境,为产品线提供前端开发底层架构 ...
- vdp介绍
In the new vSphere 5.1, there is a missing component replaced by a new one: VMware Data Recovery (VD ...
- Windows中snmputil.exe工具的使用
一.检查windows 系统是否安装了 snmp 组件.可以在 cmd 中输入"net start snmp" 就可以出现显示信息了 二. snmputil,就是程序名拉,呵呵. ...