题目列表

问题描述

有一个文本框,可以执行以下操作:

  • 输入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>=16f[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周:打表找规律的更多相关文章

  1. hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)

    Nim or not Nim? Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Sub ...

  2. HDU 5753 Permutation Bo (推导 or 打表找规律)

    Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...

  3. HDU 4861 Couple doubi (数论 or 打表找规律)

    Couple doubi 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/D Description DouBiXp has a ...

  4. 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 ...

  5. 【ZOJ】3785 What day is that day? ——浅谈KMP在ACM竞赛中的暴力打表找规律中的应用

    转载请声明出处:http://www.cnblogs.com/kevince/p/3887827.html    ——By Kevince 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这 ...

  6. HDU 5795 A Simple Nim(SG打表找规律)

    SG打表找规律 HDU 5795 题目连接 #include<iostream> #include<cstdio> #include<cmath> #include ...

  7. hdu_5894_hannnnah_j’s Biological Test(打表找规律)

    题目链接:hdu_5894_hannnnah_j’s Biological Test 题意: 有n个不同的位置围成一个圈,现在要安排m个人坐,每个人至少的间隔为k,问有多少种安排 题解: 先打表找规律 ...

  8. hdu_5795_A Simple Nim(打表找规律的博弈)

    题目链接:hdu_5795_A Simple Nim 题意: 有N堆石子,你可以取每堆的1-m个,也可以将这堆石子分成3堆,问你先手输还是赢 题解: 打表找规律可得: sg[0]=0 当x=8k+7时 ...

  9. hdu_5793_A Boring Question(打表找规律)

    题目链接:hdu_5793_A Boring Question 题意: 自己看吧,说不清楚了. 题解: 打表找规律 #include<cstdio> typedef long long l ...

  10. hdu 3032 Nim or not Nim? (sg函数打表找规律)

    题意:有N堆石子,每堆有s[i]个,Alice和Bob两人轮流取石子,可以从一堆中取任意多的石子,也可以把一堆石子分成两小堆 Alice先取,问谁能获胜 思路:首先观察这道题的数据范围  1 ≤ N ...

随机推荐

  1. javascript this详解 面向对象

    在面向对象编程语言中,对于this关键字我们是非常熟悉的.比如C++.C#和Java等都提供了这个关键字     虽然在开始学习的时候觉得比较难,但只要理解了,用起来是非常方便和意义确定的.JavaS ...

  2. 多维数组分解----SVD在推荐系统中的应用-

    http://www.janscon.com/multiarray/rs_used_svd.html [声明]本文主要参考自论文<A SINGULAR VALUE DECOMPOSITION A ...

  3. (转)[Unity3D]BuildPipeline.PushAssetDependencies 打包依赖包,优化UI Prefab的资源引用加载(坑爹之处)

    转自:http://blog.csdn.net/chiuan/article/details/39040421#reply 1:长话短说,UI Prefab中一般会交叉引用Atlas,那么打包时候我们 ...

  4. nod32的内网在线更新设置

    需要一个iis地址,最好能够目录浏览,权限够大. 还必须: 增加一个MIME类型,.ver,类型填写application/x-ver

  5. GL_ACTIVE_UNIFORMS可能不会返回没有用到的uniform

    To query for the list of active uniforms in a program, you first call glGetProgramiv with the GL_ACT ...

  6. 浅谈压缩感知(十四):傅里叶矩阵与小波变换矩阵的MATLAB实现

    主要内容: 傅里叶矩阵及其MATLAB实现 小波变换矩阵及其MATLAB实现  傅里叶矩阵及其MATLAB实现 傅里叶矩阵的定义:(来源: http://mathworld.wolfram.com/F ...

  7. js获取GET参数

    自定义函数 /*-----------------实现1--------------------*/ function getPar(par){ //获取当前URL var local_url = d ...

  8. Persistent Netcat Backdoor

    In this example, instead of looking up information on the remote system, we will be installing a net ...

  9. 微信小程序 - 沉浸式抽屉(非组件)

    高度有限制,可作为管理界面,点击下载示例:drawer

  10. MDX Step by Step 读书笔记(八) - Navigating Hierarchies 层次结构导航

    开篇介绍 本章主要内容包括: 解释各种不同的 MDX 导航函数的使用: Parent, Children, FirstChild, LastChild, Siblings, FirstSibling, ...