首页 > 其他分享 >2024.9.2杂记

2024.9.2杂记

时间:2024-09-21 17:46:28浏览次数:8  
标签:输出 string 2024.9 铺满 long 砖头 字符串 杂记

洛谷P1990 覆盖墙壁

题目描述

你有一个长为 \(N\) 宽为 \(2\) 的墙壁,给你两种砖头:一个长 \(2\) 宽 \(1\),另一个是 L 型覆盖 \(3\) 个单元的砖头。如下图:

0  0
0  00

砖头可以旋转,两种砖头可以无限制提供。你的任务是计算用这两种来覆盖 \(N\times 2\) 的墙壁的覆盖方法。例如一个 \(2\times3\) 的墙可以有 \(5\) 种覆盖方法,如下:

012 002 011 001 011  
012 112 022 011 001

注意可以使用两种砖头混合起来覆盖,如 \(2\times4\) 的墙可以这样覆盖:

0112
0012

给定 \(N\),要求计算 \(2\times N\) 的墙壁的覆盖方法。由于结果很大,所以只要求输出最后 \(4\) 位。例如 \(2\times 13\) 的覆盖方法为 \(13465\),只需输出 \(3465\) 即可。如果答案少于 \(4\) 位,就直接输出就可以,不用加前导 \(0\),如 \(N=3\) 时输出 \(5\)。

输入格式

一个整数 \(N\),表示墙壁的长。

输出格式

输出覆盖方法的最后 \(4\) 位,如果不足 \(4\) 位就输出整个答案。

样例 #1

输入样例 #1

13

输出样例 #1

3465

提示

数据保证,\(1\leq N\leq 1000000\)。

解题思路

解题方法来自 info___tion

假设 \(f_n\) 表示前 \(n\) 列被铺满的方案数,则

  • 当前 \(n-1\) 列被铺满,铺满前 \(n\) 列方案数为 \(f_{n-1}\),这时只能放置竖立的砖头;

  • 当前 \(n-2\) 列被铺满,铺满前 \(n\) 列方案数为 \(f_{n-2}\),这时只能放置横着的砖头;倘若放置竖立的砖头,则和上一个重复;

  • 假设 \(g_n\) 表示前 \((n+1)\) 列被铺满的,但目前第 \((n+1)\) 列未被铺满的方案数,则有两种情况,一种是该列上面缺失,另一种是该列下面缺失,则铺满前 \(n\) 列有 \(2 * g_{n-2}\);

    • 维护 \(g_n\),要么是后面补了一个横着的砖头,要么是补了一个 \(L\) 型砖头,因此 \(g_n=g_{n-1}+f_{n-1}\)。

C++代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1000010, M = 10000;
typedef long long LL;

int n;
int f[N], g[N];

int main() {
    cin >> n;
    f[0] = 1, g[0] = 0, f[1] = g[1] = 1;
    for (int i = 2; i <= n; i++) {
    	f[i] = ((f[i - 1] + f[i - 2]) % M + 2 * g[i - 2] % M) % M;
    	g[i] = (g[i - 1] + f[i - 1]) % M;
    }
    cout << f[n];
    return 0;
}

洛谷P3612 [USACO17JAN] Secret Cow Code S

题面翻译

奶牛正在试验秘密代码,并设计了一种方法来创建一个无限长的字符串作为其代码的一部分使用。

给定一个字符串,对字符串进行一次操作(每一次正确的操作,最后一个字符都会成为新的第一个字符),然后把操作后的字符串放到操作前的字符串的后面。也就是说,给定一个初始字符串,之后的每一步都会增加当前字符串的长度。

给定初始字符串和 \(N\),请帮助奶牛计算无限字符串中位置为 \(N\) 的字符。

第一行输入一个字符串。该字符串包含最多 \(30\) 个大写字母,数据保证 \(N \leq 10^{18}\)。

第二行输入 一个整数 \(N\)。请注意,数据可能很大,放进一个标准的 \(32\) 位整数容器可能不够,所以你可能要使用一个 \(64\) 位的整数容器(例如,在 C/C++ 中是 long long)。

请输出从初始字符串生成的无限字符串中的下标为 \(N\) 的字符。第一个字符的下标是 \(N=1\)。

感谢 @y_z_h 的翻译

题目描述

The cows are experimenting with secret codes, and have devised a method for creating an infinite-length string to be used as part of one of their codes.

Given a string \(s\), let \(F(s)\) be \(s\) followed by \(s\) "rotated" one character to the right (in a right rotation, the last character of \(s\) rotates around and becomes the new first character). Given an initial string \(s\), the cows build their infinite-length code string by repeatedly applying \(F\); each step therefore doubles the length of the current string.

Given the initial string and an index \(N\), please help the cows compute the character at the \(N\)th position within the infinite code string.

输入格式

The input consists of a single line containing a string followed by \(N\). The string consists of at most 30 uppercase characters, and \(N \leq 10^{18}\).

Note that \(N\) may be too large to fit into a standard 32-bit integer, so you may want to use a 64-bit integer type (e.g., a "long long" in C/C++).

输出格式

Please output the \(N\)th character of the infinite code built from the initial string. The first character is \(N=1\).

样例 #1

样例输入 #1

COW 8

样例输出 #1

C

提示

In this example, the initial string COW expands as follows:


COW -> COWWCO -> COWWCOOCOWWC

解题思路

分治。

对于一个长度为 \(2n\) 的字符串 \(S\),可知 \(S_n=S_{n+1}\),\(S_i=S_{i+n+1}\ (1\le i \le n-1)\),因此根据此可以将大问题划分为小问题。

  • 如果 \(t\) 位于 \(n+1\),则相当于求解 \(t-1\) 处的字符;

  • 如果 \(t\) 位于 \([n+2,2n]\),则求解 \(t-(n+1)\) 的字符,而 \(n=S.length * 2^{x}\)。

C++代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1010, M = 10000;
typedef long long LL;

string S;
LL n, length;

void dfs(LL n) {
	if (n <= length) {
		cout << S[n - 1];
		return;
	}
	LL i = length;
	while ((i << 1) < n) i <<= 1;
	n -= (i + 1);
	if (n == 0) n = i;
	dfs(n);
}

int main() {
	cin >> S >> n;
	length = S.size();
	dfs(n);
    return 0;
}

标签:输出,string,2024.9,铺满,long,砖头,字符串,杂记
From: https://www.cnblogs.com/Cocoicobird/p/18424317

相关文章

  • 2024.9.20
    publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);StudentManagermanager=newStudentManager(5);while(true){System.out.println("");System.out.println("石家庄铁道大学软件工程系学生信息管理系统");System.out.println(&q......
  • 2024.9.6校测
    T1题目描述猫猫是丛林里很多动物心中的天使,她为此十分自豪。猫猫最爱吃鱼了,她每天都要去池塘钓鱼吃。猫猫经常吃鱼脑,数学特别强,然而,小女生的性格决定了她的贪玩。一天,猫猫钓到了很多条鱼。她并不想马上就把可怜的鱼儿吃掉,而是先折磨够之后再吃(有句话叫什么来着,最毒不过猫猫心)。......
  • 2024.9.16上午校测
    T1题目描述首先,让我们来一道萌萌哒的并查集吧。你有\(n\)个萌萌哒元素。每个元素都单独在一个集合中。同时,我们有\(n-1\)个操作,每次合并两个元素所在的集合,保证合并前两个元素位于不同的集合。现在有\(m\)个询问\((x,y)\),每次询问需要你输出元素\(x,y\)第一次位......
  • 2024.9.13校测
    T1题目描述Gnaw刚刚学习在数字逻辑中学到了格雷码,它的定义是这样的,对于二进制数\(A\),它对应的格雷码为\(G=A\operatorname{xor}(A>>1)\),格雷码有个很有趣的性质是相邻二进制数对应的格雷码只有一位不同。现在以\(01?\)的方式给出一个长为的二进制数\(m\),\(?\)表示......
  • 2024.9.16下午校测
    T1题目描述有\(n\)个人站成一行,每个人有一个魅力值,相同魅力值的人会形成一个团伙,你出于对于社会和谐发展的考虑,定义一个团伙正常当且仅当团伙人数为\(2\),现在你的任务就是回答\(M\)个询问,每次询问一个区间\([L,R]\),你需要回答这个区间中所有人各自结成团伙后,处于不正常团......
  • 网络安全C10-2024.9.15-Nmap、Xray、Nessus和AWVS使用扫描
    1、安装并使用Nmap扫描一个地址(本机、VPS、虚拟机环境都可以),提供扫描结果截图nmap下载安装:https://nmap.org/download#windowsnmap概述:Nmap(“NetworkMapper<网络映射器>”)是一款开放源代码的网络探测和安全审核的工具。Nmap输出的是扫描目标的列表,以及每个目标的补充信息,......
  • 2024.9.19
    双向链表插入:即在单链表插入的基础上增加对前指针的修改循环链表:即将尾部结点的next从NULL改为指向头指针线性表的应用:1.线性表的合并(LB合并到LA中):将LB中元素逐个取出,在LA中进行逐个查访,不存在就插入。2.有序表的合并(LA,LB合并到LC):对LA,LB中元素依次比大小后插入。链式......
  • 2024.9.18
    线性表的顺序存储结构用一组连续的存储单元依次存储线性表的数据元素。特点:线性表的顺序存储是一种随机存取的存储结构。随机存取:即读写存储的消息的时间与存储的位置无关defineMAXSIZE100typedefstruct{ElemTypeelem;//存储空间的基地址intMAXSIZE//容量intlength;......
  • 2024.9.13 近期练习
    CF1930E2..3...4....Wonderful!Wonderful!我们相当于计算\(01\)串的个数,\(0\)表示删除了,\(1\)表示还保留着。考虑\(01\)串合法的条件:首先\(0\)的个数为\(2k\)的倍数;其次存在\(1\)使得其左侧和右侧都至少有\(k\)个\(0\)。考虑从最后一次操作回退。我们选择一......
  • 2024.9.18 LGJ Round
    C\(n\timesm\)个人,选择某人的代价是\(a_{i,j}\),可以使其负责其所在的行/列,问使得所有行列被负责最小代价。\(nm\le10^5\)。若选择\(a_{i,j}\),看做是第\(i\)行跟第\(j\)列连了一条有向边,你发现最后图的形式是一个基环树森林。但是边是有向的,不难发现如果我们确定了基......