前言

依旧是白嫖账号,只打了一些题/kk


正题


1002 Buying Snacks

题目大意

\(n\)个物品,每个可以买一次也可以不买,如果买需要选择\(1/2\)块钱的,然后也可以相邻两个一起买并且减少一块的花销,求恰好用掉\(m\)块钱的方案。

\(1\leq n\leq 10^9,1\leq m\leq 20000,1\leq T\leq 5\)

解题思路

设\(f_{i,j}\)表示\(i\)个物品花\(j\)块钱的方案那么有

\[f_{i,j}=f_{i-1,j}+f_{i-1,j-1}+f_{i-1,j-2}+f_{i-2,j-1}+2\times f_{i-2,j-2}+f_{i-2,j-3}
\]

然后化成生成函数就是

\[F_i(x)=(1+x+x^2)F_{i-1}(x)+(x+2x^2+x^3)F_{i-2}(x)
\]

和之前一道倍增\(FFT\)很像,然后考虑分割位置填两个就是\(F_{1}(x)=1+x+x^2\),然后

\[F_{a+b}(x)=F_{a}(x)F_b(x)+(x+2x^2+x^3)F_{a-1}(x)F_{b-1}(x)
\]

上倍增\(FFT\)就好了。

code

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define ll long long
  5. using namespace std;
  6. const ll N=1<<16,P=998244353;
  7. ll T,n,k,m,r[N],f[3][N],t[3][N],g[2][N];
  8. void fm(ll &x){x+=x>>31&P;}
  9. ll power(ll x,ll b){
  10. ll ans=1;
  11. while(b){
  12. if(b&1)ans=ans*x%P;
  13. x=x*x%P;b>>=1;
  14. }
  15. return ans;
  16. }
  17. void NTT(ll *f,ll op){
  18. for(ll i=0;i<n;i++)
  19. if(i<r[i])swap(f[i],f[r[i]]);
  20. for(ll p=2;p<=n;p<<=1){
  21. ll tmp=power(3,(P-1)/p),len=p>>1;
  22. if(op==-1)tmp=power(tmp,P-2);
  23. for(ll k=0;k<n;k+=p){
  24. ll buf=1;
  25. for(ll i=k,tt;i<(k|len);i++){
  26. tt=1ll*buf*f[i|len]%P;
  27. fm(f[i|len]=f[i]-tt);
  28. fm(f[i]=f[i]+tt-P);
  29. buf=1ll*buf*tmp%P;
  30. }
  31. }
  32. }
  33. if(op==-1){
  34. ll invn=power(n,P-2);
  35. for(ll i=0;i<n;i++)
  36. f[i]=1ll*f[i]*invn%P;
  37. }
  38. return;
  39. }
  40. void print(ll x)
  41. {if(x>9)print(x/10);putchar(x%10+'0');return;}
  42. signed main()
  43. {
  44. scanf("%lld",&T);
  45. while(T--){
  46. memset(f,0,sizeof(f));
  47. memset(g,0,sizeof(g));
  48. memset(t,0,sizeof(t));
  49. scanf("%lld%lld",&m,&k);k++;n=1;
  50. while(n<(k*2))n<<=1;
  51. for(ll i=0;i<n;i++)
  52. r[i]=(r[i>>1]>>1)|((i&1)?(n>>1):0);
  53. f[0][0]=f[0][1]=f[0][2]=f[1][0]=g[0][0]=1;
  54. for(ll d=1;d<=m;d<<=1){
  55. if(m&d){
  56. for(ll j=0;j<3;j++){
  57. for(ll i=0;i<n;i++)
  58. t[j][i]=(i<k)?f[j][i]:0;
  59. NTT(t[j],1);
  60. }
  61. NTT(g[0],1);NTT(g[1],1);
  62. for(ll i=0;i<n;i++){
  63. ll b0=g[0][i],b1=g[1][i];
  64. g[0][i]=1ll*b0*t[0][i]%P;
  65. g[1][i]=1ll*b0*t[1][i]%P;
  66. t[0][i]=1ll*t[1][i]*b1%P;
  67. t[1][i]=1ll*t[2][i]*b1%P;
  68. }
  69. NTT(g[0],-1);NTT(g[1],-1);
  70. NTT(t[0],-1);NTT(t[1],-1);
  71. for(ll i=0;i<k;i++){
  72. (g[0][i+1]+=t[0][i])%=P;(g[0][i+2]+=2ll*t[0][i])%=P;(g[0][i+3]+=t[0][i])%=P;
  73. (g[1][i+1]+=t[1][i])%=P;(g[1][i+2]+=2ll*t[1][i])%=P;(g[1][i+3]+=t[1][i])%=P;
  74. }
  75. for(ll i=k;i<n;i++)g[0][i]=g[1][i]=0;
  76. }
  77. if(d*2>m)break;
  78. for(ll j=0;j<3;j++){
  79. for(ll i=0;i<n;i++)
  80. t[j][i]=(i<k)?f[j][i]:0;
  81. NTT(t[j],1);
  82. }
  83. for(ll i=0;i<n;i++){
  84. f[0][i]=1ll*t[0][i]*t[0][i]%P;
  85. f[1][i]=1ll*t[1][i]*t[0][i]%P;
  86. f[2][i]=1ll*t[1][i]*t[1][i]%P;
  87. t[0][i]=1ll*t[1][i]*t[1][i]%P;
  88. t[1][i]=1ll*t[1][i]*t[2][i]%P;
  89. t[2][i]=1ll*t[2][i]*t[2][i]%P;
  90. }
  91. for(ll j=0;j<3;j++)
  92. NTT(f[j],-1),NTT(t[j],-1);
  93. for(ll i=0;i<k-1;i++){
  94. (f[0][i+1]+=t[0][i])%=P;(f[0][i+2]+=2ll*t[0][i])%=P;(f[0][i+3]+=t[0][i])%=P;
  95. (f[1][i+1]+=t[1][i])%=P;(f[1][i+2]+=2ll*t[1][i])%=P,(f[1][i+3]+=t[1][i])%=P;
  96. (f[2][i+1]+=t[2][i])%=P;(f[2][i+2]+=2ll*t[2][i])%=P;(f[2][i+3]+=t[2][i])%=P;
  97. }
  98. for(ll i=k;i<n;i++)f[0][i]=f[1][i]=f[2][i]=0;
  99. }
  100. for(ll i=1;i<k;i++)
  101. print(g[0][i]),putchar(' ');
  102. putchar('\n');
  103. }
  104. return 0;
  105. }

1004 Counting Stars

题目大意

\(n\)个数字要求支持操作

  1. 将一个区间所有数字的最低位减去
  2. 将一个区间非零数字的最高位提高一位

每次操作玩输出操作区间的和

\(1\leq T\leq 5,1\leq n,q\leq 10^5,1\leq a_i\leq 10^9\)

解题思路

每个数字操作一最多执行\(\log a_i\)次所以这个操作暴力做就好了

然后第二个操作我们把每个数字的最高位分离出来就变成了区间乘二。

代码是\(\text{lemondinosaur}\)爷写的


1006 GCD Game

题目大意

\(n\)个数字每次操作的人可以选择一个数字\(x\)然后找一个\(1\leq k<x\)将\(x\)变为\(gcd(x,k)\)。

不能操作者输,求是否先手必胜

\(1\leq T\leq 100,\sum n\leq 10^6,1\leq a_i\leq 10^7\)

解题思路

其实就是去掉任意个质因子,所以用线性筛筛出每个数字的最小质因子,然后递推出每个数字的质因子数就好了。

时间复杂度\(O(a_i+\sum n)\)

code

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=1e7+10;
  6. int T,n,cnt,pri[N/10],v[N],c[N];
  7. void Prime(){
  8. v[1]=1;
  9. for(int i=2;i<N;i++){
  10. if(!v[i])pri[++cnt]=i,v[i]=i;
  11. for(int j=1;j<=cnt&&i*pri[j]<N;j++){
  12. v[i*pri[j]]=pri[j];
  13. if(i%pri[j]==0)break;
  14. }
  15. }
  16. return;
  17. }
  18. int main()
  19. {
  20. Prime();
  21. for(int i=2;i<N;i++)
  22. c[i]=c[i/v[i]]+1;
  23. scanf("%d",&T);
  24. while(T--){
  25. scanf("%d",&n);int ans=0;
  26. for(int i=1,x;i<=n;i++)
  27. scanf("%d",&x),ans=ans^c[x];
  28. if(ans)puts("Alice");
  29. else puts("Bob");
  30. }
  31. return 0;
  32. }

1009 Singing Superstar

题目大意

给一个字符串\(S\),\(n\)次询问字符串\(a_i\)在\(S\)中出现的最大不重次数。

\(1\leq T\leq 5,1\leq n\leq 10^5,1\leq |a_i|\leq 30,\sum |S|,\sum|a_i|\leq 4\times 10^5\)

解题思路

根据贪心的思想是能够匹配尽量匹配

把所有\(S\)长度不超过\(30\)的子串建一棵\(Trie\),然后记下每个子串的最后出现位置然后统计\(ans\)就好了。

code

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define ull unsigned long long
  5. using namespace std;
  6. const int N=1e5+10;
  7. int n,T,l,cnt,ans[N*30],t[N*30][26],last[N*30];
  8. char s[N],st[N];
  9. int main()
  10. {
  11. scanf("%d",&T);
  12. while(T--){
  13. scanf("%s",s+1);l=strlen(s+1);
  14. cnt=1;last[1]=ans[1]=0;
  15. memset(t[1],0,sizeof(t[1]));
  16. for(int i=1;i<=l;i++){
  17. int x=1;
  18. for(int j=1;j<=30;j++){
  19. if(i-j+1<1)break;
  20. int c=s[i-j+1]-'a';
  21. if(!t[x][c]){
  22. cnt++;memset(t[cnt],0,sizeof(t[cnt]));
  23. t[x][c]=cnt;last[cnt]=ans[cnt]=0;
  24. }
  25. x=t[x][c];
  26. if(i-last[x]>=j)last[x]=i,ans[x]++;
  27. }
  28. }
  29. scanf("%d",&n);
  30. while(n--){
  31. scanf("%s",st+1);
  32. int tl=strlen(st+1),x=1;
  33. for(int i=tl;i>=1;i--)
  34. x=t[x][st[i]-'a'];
  35. printf("%d\n",ans[x]);
  36. }
  37. }
  38. return 0;
  39. }

2021“MINIEYE杯”中国大学生算法设计超级联赛(8)(1002,1004,1006,1009)的更多相关文章

  1. 2021“MINIEYE杯”中国大学生算法设计超级联赛(7)部分题解

    前言 找大佬嫖到个号来划水打比赛了,有的题没写或者不是我写的就不放了. 目前只有:1004,1005,1007,1008,1011 正题 题目链接:https://acm.hdu.edu.cn/con ...

  2. 2022“杭电杯”中国大学生算法设计超级联赛(6)- 1011 Find different

    2022"杭电杯"中国大学生算法设计超级联赛(6)- 1011 Find different 比赛时队友开摆,还剩半个小时,怎么办?? 当然是一起摆 Solution 看到这个题没 ...

  3. 3I工作室的成员在2013年(第6届)中国大学生计算机设计大赛总决赛中荣获全国二等奖

    在暑假举行的2013年(第6届)中国大学生计算机设计大赛中,我院的参赛作品<毕业生论文选导系统>(作者:祝丽艳/许明涛:指导老师:元昌安/彭昱忠)入围总决赛,并荣获全国二等奖. 2013年 ...

  4. 2016年中国大学生程序设计竞赛(合肥)-重现赛1009 HDU 5969

    最大的位或 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  5. "巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场

    Combine String #include<cstdio> #include<cstring> #include<iostream> #include<a ...

  6. hdu_5705_Clock("巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5705 题意:给你一个时间和一个角度,问你下一个时针和分针形成给出的角度是什么时候 题解:我们可以将这个 ...

  7. hdu_5707_Combine String("巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5707 题意:给你三个字符串 a,b,c,问你 c能否拆成a,b,a,b串的每一个字符在c中不能变 题解 ...

  8. 2017年“嘉杰信息杯” 中国大学生程序设计竞赛全国邀请赛 Highway

    Highway Accepted : 122   Submit : 393 Time Limit : 4000 MS   Memory Limit : 65536 KB Highway In ICPC ...

  9. HDU 6024(中国大学生程序设计竞赛女生专场1002)

    这是CCPC女生专场的一道dp题.大佬们都说它简单,我并没有感到它有多简单. 先说一下题意:在一条直线上,有n个教室,现在我要在这些教室里从左到右地建设一些作为糖果屋,每个教室都有自己的坐标xi 和建 ...

随机推荐

  1. 快速解决flutter中package包版本冲突问题

    当你的项目需要安装的依赖包越多,遇到包冲突可能性就越大,尤其是当依赖的包有重大更新时.比如下图: 上面可以看到是xml跟intl_translation两个包有冲突,因为他们依赖两个不同的petitp ...

  2. Wpf程序显示在任务栏

    后台代码如下: using System; using System.Collections.Generic; using System.Drawing; using System.IO; using ...

  3. 二 MongoDB数据类型和$type操作符

    一.MongoDB中可以使用的类型如下表所示 二.$type操作符 举个例子:想获取指定集合中title为String类型的所有文档

  4. 进程CPU、内存过高问题查找

    1.定位进程 找出占用CPU最高的10个进程 ps aux | sort -k3nr | head -n 10 查看占用内存最高的10个进程 ps aux | sort -k4nr | head -n ...

  5. Go依赖包管理--间接依赖

    目录 1.indirect含义 1.2 直接依赖未启用 Go module 1.2 直接依赖 go.mod 文件不完整 2.总结 1.indirect含义 在使用 Go module 过程中,随着引入 ...

  6. 解决->maven下载失败bug

    一.前言: 经过一个下午的奋斗(谷歌,视频...重装)后终,于暂时解决了上一篇文章中的bug 传送门:https://blog.csdn.net/weixin_44092288/article/det ...

  7. 图解最长回文子串「Manacher 算法」,基础思路感性上的解析

    问题描述: 给你一个字符串 s,找到 s 中最长的回文子串. 链接:https://leetcode-cn.com/problems/longest-palindromic-substring 「Ma ...

  8. mpvue 生成字节跳动小程序的问题!!

    初始化项目文件 $ vue init mpvue/mpvue-quickstart fuck $ cd fuck $ npm install 这个时候就初始化好了,接下来 $ npm run dev: ...

  9. vue的常见理论问题

    1.什么是 mvvm? mvvm 和 mvc 区别? MVVM 是 Model-View-ViewModel 的缩写.mvvm 是一种设计思想.Model 层代表数据模型,View 代表 UI 组件. ...

  10. Python - 执行顺序、执行入口

    Python 是如何执行的?执行顺序是怎么样? 至上而下,逐行执行 #!usr/bin/env python # -*- coding:utf-8 _*- """ # a ...