题目列表

问题描述

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

  • 输入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. SendMessage消息大全及说明

    WM_CREATE   =   &H0001     应用程序创建一个窗口     WM_DESTROY   =   &H0002     一个窗口被销毁     WM_MOVE   ...

  2. 【Scala】Java-Scala-单例模式实现方法

    Java-Scala-单例模式实现方法 scala 单例_百度搜索 scala实现单例模式-博客-云栖社区-阿里云

  3. awk学习 (good)

    原文:http://blog.chinaunix.net/uid-23302288-id-3785105.html awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓 ...

  4. nodejs发送请求

    const https = require('https'); var options = { hostname: 'registry.yarnpkg.com', port: 443, path: ' ...

  5. ElasticSearch 5.X 搜索并用高亮显示

    public List<WOSearchModel> searchOrder(OrderSearchReqVO request) throws Exception{List<WOSe ...

  6. URL重写2.1.mis

    概观 IIS URL重写2.1使Web管理员能够创建强大的规则来实现更容易让用户记住的网址,并使搜索引擎更容易找到.通过使用规则模板,重写映射,.NET提供程序和集成到IIS管理器中的其他功能,Web ...

  7. OSError: Could not find library geos_c or load any of its variants ['libgeos_c.so.1', 'libgeos_c.so

    OSError: Could not find library geos_c or load any of its variants ['libgeos_c.so.1', 'libgeos_c.so ...

  8. chrome插件编写基本入门

    chrome插件编写基本入门  http://igeekbar.com/igeekbar/post/331.htm #精选JAVASCRIPTCHROME 作为一名程序猿,怎么能不会写chrome插件 ...

  9. file: /SourceCache/IOKitUser_Sim/IOKitUser-920.1.11/hid.subproj/IOHIDEventQueue.c, line: 512

    //修改main.m 文件. typedef int (*PYStdWriter)(void *, const char *, int); static PYStdWriter _oldStdWrit ...

  10. LintCode: Valid Parentheses

    C++ stack<char|int|string>, push(), pop(), top(), empty(), size() class Solution { public: /** ...