NOIP模拟17.8.17

A 小 G 的字符串
文件名 输入文件 输出文件 时间限制 空间限制
str.pas/c/cpp str.in str.out 1s 128MB
【题目描述】
有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的、全由小写英文
字母构成的字符串,只能使用 k 种字母。要求满足:
• 字符串中相邻的两个字母不能相同。
• 必须出现恰好 k 种不同的字母。
这样的合法字符串可能有很多,小 L 让小 G 输出字典序最小的那个。
小 G 太笨啦,不会做这道题,希望你帮帮他。
【输入格式】
输入文件只有两个数字 n, k,含义如题。
【输出格式】
输出文件共一行,输出合法的字典序最小的字符串。
如果不存在任意一个合法的方案,输出 −1。
【样例输入】
7 4
【样例输出】
ababacd
【数据范围】
对于 100% 的数据,1 ≤ n ≤ 105, 1 ≤ k ≤ 26

【题解】

注意特判。我忘记了k == 1 && n != 1的情况。。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5.  
  6. const int MAXN = + ;
  7.  
  8. int n,k;
  9. char s[MAXN];
  10.  
  11. int main()
  12. {
  13. scanf("%d %d", &n, &k);
  14. if(k > n || k == || n == || (k == && n != ))
  15. {
  16. printf("-1");
  17. return ;
  18. }
  19. else if(k == )
  20. {
  21. for(register int i = ;i <= n;++ i)printf("%c", 'a');
  22. return ;
  23. }
  24. else if(k == )
  25. {
  26. for(register int i = , j = ;i <= n;++ i, j ^= )printf("%c", 'a' + j);
  27. return ;
  28. }
  29. register int p = , j;
  30. for(p = n, j = ;p > k - ;-- p, j ^= )
  31. printf("%c", 'a' + j);
  32. for(j = ;p >= ;-- p,++ j)
  33. printf("%c", 'b' + j);
  34. return ;
  35. }

T1

B 小 G 的城堡
文件名 输入文件 输出文件 时间限制 空间限制
castle.pas/c/cpp castle.in castle.out 1s 128MB
【题目描述】
小 G 家有一座城堡。城堡里面有 n 个房间,每个房间上都写着一个数字 pi。
小 G 拉着几个小伙伴在城堡里面玩耍,他们约定,如果某个人当前站在 i 房间里
面,下一步这个人就会去 pi 房间,再下一步这个人去 ppi。
为了增加趣味性,小 G 想重新书写每个房间的 pi,以满足:
• 如果从编号 1 到 k 中的某个房间开始,按照规则走,必须能够走到 1 号房间。
特别地,如果从 1 号房间开始走,也要能够走回 1 号房间(至少走一步,如
果 p1 = 1,从 1 走到 1 也算合法)。
• 如果从编号大于 k 的某个房间开始,按照规则走,一定不能走到 1 号房间。
小 G 想知道,有多少种书写 pi 的方案,可以满足要求。
【输入格式】
输入文件一行两个数字 n, k,含义如题。
【输出格式】
输出文件一个数字,表示合法的方案数。答案对 109 + 7 取模。
【样例输入 1】
5 2
【样例输出 1】
54
【样例输入 2】
7 4
【样例输出 2】
1728
【数据范围】
对于 40% 的数据,1 ≤ n ≤ 8
对于 70% 的数据,1 ≤ n ≤ 105
对于 100% 的数据,1 ≤ n ≤ 1018, 1 ≤ k ≤ min(8, n)。

【题解】

我们发现,前k个点肯定和前k个点互相连边。后n-k个点肯定不会连到

前k个点里面去。
所以,我们只要爆搜前k个点连接的方案,然后检查;后n-k个点,只要

连的是后n-k个点,爱怎么连怎么连,方案数是(n-k)^(n-k)。最后把两

部分方案数乘起来就行。——tygg

但同时,我们发现:前k个点有规律:n^(n - 1)

不知是否正确

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5.  
  6. const long long MOD = + ;
  7.  
  8. inline void read(long long& x)
  9. {
  10. x = ;char ch = getchar(), c = ch;
  11. while(ch < '' || ch > '')c = ch, ch = getchar();
  12. while(ch <= '' && ch >= '')x = x * + ch - '', ch = getchar();
  13. if(c == '-')x = -x;
  14. }
  15.  
  16. long long n,k,ans;
  17.  
  18. long long pow(long long a, long long b)
  19. {
  20. long long r = , base = a%MOD;
  21. for(;b;b >>= )
  22. {
  23. if(b & )r *= base, r %= MOD;
  24. base *= base, base %= MOD;
  25. }
  26. return r;
  27. }
  28.  
  29. int main()
  30. {
  31. read(n);read(k);
  32. ans = pow(k, k - )%MOD;
  33. printf("%lld", (ans * pow(n - k, n - k))%MOD);
  34. return ;
  35. }

T2

C 小 G 坐电梯
文件名 输入文件 输出文件 时间限制 空间限制
lift.pas/c/cpp lift.in lift.out 2s 128MB
【题目描述】
小 G 来到了著名的 CIGOM 大厦。大厦一共有 n 层,初始的时候小 G 在第 A
层。小 G 特别想去 B 层小 M 的办公室看一看,然而因为安保原因,B 层已经被
封锁无法进入。
但是小 G 既然来了,就想在大厦里面逛一逛。大厦里面有一部电梯,小 G 决
定坐 k 次电梯。因为小 G 比较无聊,他给自己设定了这样一个规矩:假如当前他
在 x 层,则他要去的下一个楼层 y 和 x 的楼层差必须要小于 x 和 B 的楼层差,即
|x − y| < |x − B|。每到达一个楼层,小 G 都要记录下来其楼层号。
当小 G 转完一圈后,他也记录下了 k + 1 个楼层号(可能有重复)。小 G 现在
想知道,按照他定下的规矩,一共有多少种可能的楼层号序列?
【输入格式】
输入文件一行,4 个数字 n, A, B, k,含义如题目所述。
【输出格式】
输出一个数字,表示可能的楼层号序列的数量。答案对 109 + 7 取模。
【样例输入 1】
5 2 4 1
【样例输出 1】
2
【样例输入 2】
5 2 4 2
【样例输出 2】
2
【样例输入 3】
5 3 4 1
【样例输出 3】
0
【数据范围】
对于 30% 的数据,2 ≤ n ≤ 8, 1 ≤ k ≤ 8。
对于 70% 的数据,2 ≤ n ≤ 300, 1 ≤ k ≤ 300。
对于 100% 的数据,2 ≤ n ≤ 5000, 1 ≤ k ≤ 5000, 1 ≤ A, B ≤ n, A ̸= B。

【题解】

第二遍做这个题了,之前在清北澡堂现场AC过,结果今天偷了个懒,愉快的忘了s > t的情况,挂了30分(感谢天宇哥哥数据手下留情)

令f[step][i]表示当前是第step步,走到i这个位置的方案数。
转移(我们以B层下侧为例):
f[step][i]=f[step-1][1~i-1]+f[step-1][i+1~ k]
其中,如果i+B为偶数,k=(i+B)/2-1
i+B为奇数,k=(i+B)/2
// 博主注:可以直接写i + (B - I - 1)/2

n<=5000
这样就不能用O(n)的转移了,而是要用O(1)的转移。
注意我们每次的转移都来自一个连续的区间,而且我们是求和
区间求和?
前缀和!
令sum[step][i]表示f[step][1~i]的和
还是以B下侧为例
f[step][i]=sum[step-1][i-1]+sum[step-1][k]-sum[step-1][i]
——gty

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <iostream>
  5.  
  6. const int MAXN = + ;
  7. const int MAXK = + ;
  8. const long long MOD = + ;
  9.  
  10. int n,s,t,k;
  11. long long dp[][MAXN];
  12.  
  13. int main()
  14. {
  15. scanf("%d %d %d %d", &n, &s, &t, &k);
  16. register int p = ;
  17. if(s <= t)
  18. {
  19. for(register int i = s;i < t;++ i)
  20. dp[][i] = ;
  21. for(register int i = ;i <= k;++ i, p ^= )
  22. for(register int j = ;j < t;++ j)
  23. dp[p][j] = ((dp[p][j - ] + dp[p ^ ][j + (t - j - ) / ])%MOD - (dp[p ^ ][j] - dp[p ^ ][j - ] + MOD)%MOD+MOD)%MOD;
  24. printf("%lld", dp[p^][t - ]%MOD);
  25. }
  26. if(s > t)
  27. {
  28. for(register int i = s;i > t;-- i)
  29. dp[][i] = ;
  30. for(register int i = ;i <= k;++ i, p^= )
  31. for(register int j = n;j > t;-- j)
  32. dp[p][j] = ((dp[p][j + ] + dp[p ^ ][t + (j - t + ) / ])%MOD - (dp[p ^ ][j] - dp[p ^ ][j + ] + MOD)%MOD+MOD)%MOD;
  33. printf("%lld", dp[p^][t + ]%MOD);
  34. }
  35. return ;
  36. }

T3

NOIP模拟 17.8.17的更多相关文章

  1. noip 模拟赛 After 17(递推+特殊的技巧)

    来源:Violet_II T1 好神的一题,我竟然没做出来QAQ 首先我们发现,答案是sigma(x[i]*x[j], i>j)+sigma(y[i]*y[j], i>j).显然只需要讨论 ...

  2. noip模拟赛Bywzj52501 17.10.18

    T1 rob 环形消灭虫子 先想出了一个n^2暴力 然后我们想到 如果从两个连续的点求解 则会出现仅有的两种结果 (因为这两种情况的交是全集) 当时因为Naive求了50次 #include<i ...

  3. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  4. NOIP模拟17.9.21

    NOIP模拟17.9.21 3 58 145 201 161.5 样例输出21.6 数据规模及约定对于40% 的数据,N <= 20对于60% 的数据,N <= 1000对于100% 的数 ...

  5. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  6. NOIP模拟 17.8.20

    NOIP模拟17.8.20 A.阶乘[题目描述]亲爱的xyx同学正在研究数学与阶乘的关系,但是他喜欢颓废,于是他就制作了一个和阶乘有关系的数学游戏:给出两个整数 n,m,令 t = !n,每轮游戏的流 ...

  7. NOIP模拟 17.8.18

    NOIP模拟17.8.18 A.小菜一碟的背包[题目描述]Blice和阿强巴是好朋友但萌萌哒Blice不擅长数学,所以阿强巴给了她一些奶牛做练习阿强巴有 n头奶牛,每头奶牛每天可以产一定量的奶,同时也 ...

  8. NOIP模拟 17.8.15

    NOIP模拟17.8.15 A 债务文件名 输入文件 输出文件 时间限制 空间限制debt.pas/c/cpp debt.in debt.out 1s 128MB[题目描述]小 G 有一群好朋友,他们 ...

  9. NOIP模拟 17.8.16

    NOIP模拟17.8.16 A 债务文件名 输入文件 输出文件 时间限制 空间限制debt.pas/c/cpp debt.in debt.out 1s 128MB[题目描述]小 G 有一群好朋友,他们 ...

随机推荐

  1. [Ceoi2010]Pin

    #2012. [Ceoi2010]Pin Online Judge:Bzoj-2012 Label:容斥,STL 题目描述 给出N(2<=N<=50000)个长度为4的字符串,问有且仅有D ...

  2. spring_配置处理器对象、处理器映射器、处理器适配器、视图解析器

    创建spring配置文件:application-context.xml. 创建处理器类 package com.lanou.demo.controller;public class BookCont ...

  3. xshell 连接 kali

    1   修改配置文件 vi /etc/ssh/sshd_config #PasswordAuthentication no 去掉#,并且将no修改为YES //kali中默认是yes PermitRo ...

  4. css 始终显示滚动条,内容超出显示有滑块的滚动条,内容没有超出显示空的滚动条

    1.内容没有超出显示空的滚动条 <div class="div1"> 前端开发者前端开发者前端开发者前端开发者前端开发者 </div> css代码: .di ...

  5. OSG能够在当前帧截图,也就是能转换视角后马上截图

    #include <Windows.h> #include <osg/GraphicsContext> #include <osg/Group> #include ...

  6. HDFS应用实例

  7. Luogu P2680 运输计划(二分+树上差分)

    P2680 运输计划 题意 题目背景 公元\(2044\)年,人类进入了宇宙纪元. 题目描述 公元\(2044\)年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道 ...

  8. mysqldump与mydumper

    mydumper -u root -S /srv/my3308/run/mysql.sock -B trade_platform -o /data/trade_platform

  9. Hdu 1403(后缀数组)

    题目链接 Longest Common Substring Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  10. java知识点---文件分隔符

    本篇讲述java编程中,怎样解决跨平台时,因不同系统中分隔符不同导致的文件或路径找不到的问题 首先来看两个例子: 一.linux系统和windows系统中的文件路径: Linux系统: Windows ...