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 ...
随机推荐
- 异常 Exception 堆栈跟踪 异常捕获 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 网站设计之合理架构CSS
架构CSS 在当前浏览器普遍支持的前提下,css被我们赋予了前所未有的使命.然而依赖css越多,样式表文件就会变得越大越复杂.与此同时,文件维护和组织的考验也随之而来. (曾几何时)只要一个css文件 ...
- 大数据开发实战:Stream SQL实时开发三
4.聚合操作 4.1.group by 操作 group by操作是实际业务场景(如实时报表.实时大屏等)中使用最为频繁的操作.通常实时聚合的主要源头数据流不会包含丰富的上下文信息,而是经常需要实时关 ...
- tf.concat, tf.stack和tf.unstack的用法
tf.concat, tf.stack和tf.unstack的用法 tf.concat相当于numpy中的np.concatenate函数,用于将两个张量在某一个维度(axis)合并起来,例如: a ...
- IIS配置中出现HRESULT:0X80070020错误
Win7 IIS启动失败.手工启动它,提示:“另一个程序正在使用此文件,进程无法访问!” 此时是因为另一个程序占用了IIS的端口号,IIS一般用的是80端口,是谁占用了这个端口呢? 方法如下:开始菜单 ...
- 准确率,召回率,F值,机器学习分类问题的评价指标
下面简单列举几种常用的推荐系统评测指标: 1.准确率与召回率(Precision & Recall) 准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量.其中精度 ...
- "Value does not fall within the expected range" with managed metadata fields
From: http://geekswithblogs.net/claraoscura/archive/2011/01/21/143569.aspx The problem: I have an ...
- [Angular] Use Angular components in AngularJS applications with Angular Elements
When migrating AngularJS (v1.x) applications to Angular you have different options. Using Angular El ...
- PAT《数据结构学习与实验指导》实验项目集 2-09 2-10 2-11 2-12 2-13
pat 2-09 装箱问题模拟 #include<cstdio> #include<set> #include<vector> using namespace st ...
- pager-taglib分页处理的使用
pager-taglib是java中一个用于分页的小的框架.下面简单介绍一下它的具体使用. 一.环境的搭建: 将pager-taglib-2.0.war包拷贝到Tomcat的webapps下.启动To ...