前言

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


正题


1002 Buying Snacks

题目大意

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

1≤n≤109,1≤m≤20000,1≤T≤51\leq n\leq 10^9,1\leq m\leq 20000,1\leq T\leq 51≤n≤109,1≤m≤20000,1≤T≤5

解题思路

设fi,jf_{i,j}fi,j​表示iii个物品花jjj块钱的方案那么有
fi,j=fi−1,j+fi−1,j−1+fi−1,j−2+fi−2,j−1+2×fi−2,j−2+fi−2,j−3f_{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}fi,j​=fi−1,j​+fi−1,j−1​+fi−1,j−2​+fi−2,j−1​+2×fi−2,j−2​+fi−2,j−3​
然后化成生成函数就是
Fi(x)=(1+x+x2)Fi−1(x)+(x+2x2+x3)Fi−2(x)F_i(x)=(1+x+x^2)F_{i-1}(x)+(x+2x^2+x^3)F_{i-2}(x)Fi​(x)=(1+x+x2)Fi−1​(x)+(x+2x2+x3)Fi−2​(x)
和之前一道倍增FFTFFTFFT很像,然后考虑分割位置填两个就是F1(x)=1+x+x2F_{1}(x)=1+x+x^2F1​(x)=1+x+x2,然后
Fa+b(x)=Fa(x)Fb(x)+(x+2x2+x3)Fa−1(x)Fb−1(x)F_{a+b}(x)=F_{a}(x)F_b(x)+(x+2x^2+x^3)F_{a-1}(x)F_{b-1}(x)Fa+b​(x)=Fa​(x)Fb​(x)+(x+2x2+x3)Fa−1​(x)Fb−1​(x)
上倍增FFTFFTFFT就好了。

code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1<<16,P=998244353;
ll T,n,k,m,r[N],f[3][N],t[3][N],g[2][N];
void fm(ll &x){x+=x>>31&P;}
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void NTT(ll *f,ll op){for(ll i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=n;p<<=1){ll tmp=power(3,(P-1)/p),len=p>>1;if(op==-1)tmp=power(tmp,P-2);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k,tt;i<(k|len);i++){tt=1ll*buf*f[i|len]%P;fm(f[i|len]=f[i]-tt);fm(f[i]=f[i]+tt-P);buf=1ll*buf*tmp%P;}}}if(op==-1){ll invn=power(n,P-2);for(ll i=0;i<n;i++)f[i]=1ll*f[i]*invn%P;}return;
}
void print(ll x)
{if(x>9)print(x/10);putchar(x%10+'0');return;}
signed main()
{scanf("%lld",&T);while(T--){memset(f,0,sizeof(f));memset(g,0,sizeof(g));memset(t,0,sizeof(t)); scanf("%lld%lld",&m,&k);k++;n=1;while(n<(k*2))n<<=1;for(ll i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?(n>>1):0);f[0][0]=f[0][1]=f[0][2]=f[1][0]=g[0][0]=1;for(ll d=1;d<=m;d<<=1){if(m&d){for(ll j=0;j<3;j++){for(ll i=0;i<n;i++)t[j][i]=(i<k)?f[j][i]:0;NTT(t[j],1);}NTT(g[0],1);NTT(g[1],1);for(ll i=0;i<n;i++){ll b0=g[0][i],b1=g[1][i];g[0][i]=1ll*b0*t[0][i]%P;g[1][i]=1ll*b0*t[1][i]%P;t[0][i]=1ll*t[1][i]*b1%P;t[1][i]=1ll*t[2][i]*b1%P;}NTT(g[0],-1);NTT(g[1],-1);NTT(t[0],-1);NTT(t[1],-1);for(ll i=0;i<k;i++){(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;(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;}for(ll i=k;i<n;i++)g[0][i]=g[1][i]=0;}if(d*2>m)break;for(ll j=0;j<3;j++){for(ll i=0;i<n;i++)t[j][i]=(i<k)?f[j][i]:0;NTT(t[j],1);}for(ll i=0;i<n;i++){f[0][i]=1ll*t[0][i]*t[0][i]%P;f[1][i]=1ll*t[1][i]*t[0][i]%P;f[2][i]=1ll*t[1][i]*t[1][i]%P;t[0][i]=1ll*t[1][i]*t[1][i]%P;t[1][i]=1ll*t[1][i]*t[2][i]%P;t[2][i]=1ll*t[2][i]*t[2][i]%P;}for(ll j=0;j<3;j++)NTT(f[j],-1),NTT(t[j],-1);for(ll i=0;i<k-1;i++){(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;(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;(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;}for(ll i=k;i<n;i++)f[0][i]=f[1][i]=f[2][i]=0;}for(ll i=1;i<k;i++)print(g[0][i]),putchar(' ');putchar('\n');}return 0;
}

1004 Counting Stars

题目大意

nnn个数字要求支持操作

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

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

1≤T≤5,1≤n,q≤105,1≤ai≤1091\leq T\leq 5,1\leq n,q\leq 10^5,1\leq a_i\leq 10^91≤T≤5,1≤n,q≤105,1≤ai​≤109

解题思路

每个数字操作一最多执行log⁡ai\log a_ilogai​次所以这个操作暴力做就好了

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

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


1006 GCD Game

题目大意

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

不能操作者输,求是否先手必胜
1≤T≤100,∑n≤106,1≤ai≤1071\leq T\leq 100,\sum n\leq 10^6,1\leq a_i\leq 10^71≤T≤100,∑n≤106,1≤ai​≤107

解题思路

其实就是去掉任意个质因子,所以用线性筛筛出每个数字的最小质因子,然后递推出每个数字的质因子数就好了。
时间复杂度O(ai+∑n)O(a_i+\sum n)O(ai​+∑n)

code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e7+10;
int T,n,cnt,pri[N/10],v[N],c[N];
void Prime(){v[1]=1;for(int i=2;i<N;i++){if(!v[i])pri[++cnt]=i,v[i]=i;for(int j=1;j<=cnt&&i*pri[j]<N;j++){v[i*pri[j]]=pri[j];if(i%pri[j]==0)break;}}return;
}
int main()
{Prime();for(int i=2;i<N;i++)c[i]=c[i/v[i]]+1;scanf("%d",&T);while(T--){scanf("%d",&n);int ans=0;for(int i=1,x;i<=n;i++)scanf("%d",&x),ans=ans^c[x];if(ans)puts("Alice");else puts("Bob");}return 0;
}

1009 Singing Superstar

题目大意

给一个字符串SSS,nnn次询问字符串aia_iai​在SSS中出现的最大不重次数。

1≤T≤5,1≤n≤105,1≤∣ai∣≤30,∑∣S∣,∑∣ai∣≤4×1051\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^51≤T≤5,1≤n≤105,1≤∣ai​∣≤30,∑∣S∣,∑∣ai​∣≤4×105

解题思路

根据贪心的思想是能够匹配尽量匹配
把所有SSS长度不超过303030的子串建一棵TrieTrieTrie,然后记下每个子串的最后出现位置然后统计ansansans就好了。

code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ull unsigned long long
using namespace std;
const int N=1e5+10;
int n,T,l,cnt,ans[N*30],t[N*30][26],last[N*30];
char s[N],st[N];
int main()
{scanf("%d",&T);while(T--){scanf("%s",s+1);l=strlen(s+1);cnt=1;last[1]=ans[1]=0;memset(t[1],0,sizeof(t[1]));for(int i=1;i<=l;i++){int x=1;for(int j=1;j<=30;j++){if(i-j+1<1)break;int c=s[i-j+1]-'a';if(!t[x][c]){cnt++;memset(t[cnt],0,sizeof(t[cnt]));t[x][c]=cnt;last[cnt]=ans[cnt]=0;}x=t[x][c];if(i-last[x]>=j)last[x]=i,ans[x]++;}}scanf("%d",&n);while(n--){scanf("%s",st+1);int tl=strlen(st+1),x=1;for(int i=tl;i>=1;i--)x=t[x][st[i]-'a'];printf("%d\n",ans[x]);}}return 0;
}

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

  1. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(3)签到题3题

    2021"MINIEYE杯"中国大学生算法设计超级联赛(3) Start Time : 2021-07-27 12:00:00 End Time : 2021-07-27 17:0 ...

  2. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(1)签到题15869

    2021"MINIEYE杯"中国大学生算法设计超级联赛(1) Start Time : 2021-07-20 12:10:00 End Time : 2021-07-20 17:1 ...

  3. 2021“MINIEYE杯”中国大学生算法设计超级联赛

    2021"MINIEYE杯"中国大学生算法设计超级联赛 1006 Given a sequence of integers of length n, find the shorte ...

  4. 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)

    2021"MINIEYE杯"中国大学生算法设计超级联赛(2) 1008 I love exam (类背包DP) 1010 I love permutation (数学构造,剩余系) ...

  5. 7068 Dota2 Pro Circuit 杭电多校(2021“MINIEYE杯”中国大学生算法设计超级联赛9) [贪心+双指针]

    题目 Dota2 Pro Circuit *Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Oth ...

  6. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(5)签到题4题

    Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Miserable Faith 33.33%(19/57) 1002 String Mod 2 ...

  7. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(8)

    1006 GCD Game (博弈论,nim游戏,质因子个数) 题意:有n个数a1,a2....an两个人玩游戏,Alice先动,Bob后动每次可以将一个数变为他的因子,直到不能动就输了. 题解:将问 ...

  8. 2021“MINIEYE杯”中国大学生算法设计超级联赛(1)个人解题报告

    文章目录 HDU6950 Mod, Or and Everything HDU6954 Minimum spanning tree HDU6958 KD-Graph HDU6957 Maximal s ...

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

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

最新文章

  1. 一作解读Microbiome:所谓的“富集培养”获得的微生物真的都是被“富集”出来的吗?
  2. 传智播客--WPF基础视频学习--sender解释(小白内容)
  3. 【十五分钟Talkshow】谈谈HTML 5及其对Web开发人员的挑战和机遇
  4. list 分组_「正则表达式」 匹配分组
  5. SpringSecurity认证流程回顾
  6. 趴在门口的云计算,盯上了屋内狂奔的CDN
  7. 微信又添新表情,“我裂开了”!
  8. 用SLF4j/Logback打印日志-2
  9. 计算机二级真题c.doc,2018计算机二级C语言考试真题试卷汇总.doc
  10. bootdo项目war包部署流程
  11. win7 美化Linux,让XP的主题背景拥有Win7一样的华丽 让Linux系统和Win8一模一样!超华丽Linux仿Win...
  12. CAML语法- Query写法
  13. 对嵌入式开发方向的一些思考:在物联网方向
  14. 笔记本电脑桌面没有显示计算机,关于笔记本电脑外接显示器后没有桌面图标的问题...
  15. (转)sqlite developer注册方法
  16. Excel 快速计算相邻行之间的时间差
  17. Chapter 8 中医证型关联规则挖掘
  18. 如何快速在PDF文件中插入图片
  19. Java进阶教程-马士兵
  20. pe系统如何读取手机_如何让Android手机在winpe连接电脑后显示?

热门文章

  1. colorkey唇釉是否安全_colorkey空气唇釉,19/支
  2. pca 累积方差贡献率公式_机器学习数据降维方法:PCA主成分分析
  3. php正则过滤html标签_空格_换行符的代码,PHP 正则过滤 html 标签、空格、换行符的代码 (文章格式化)...
  4. mysql not exists 效率高_mysql not in、left join、IS NULL、NOT EXISTS 效率问题记录
  5. mysql设置表名字为占位符_这可能是把MySQL存储引擎讲解的最清楚的一篇文章了
  6. php判断子字符串位置,PHP怎样查询子字符串位置
  7. ueditor如何设置上传图片的高度宽度_怎么设置天猫主图
  8. lunixs 常用命令c语言,常用Lunix命令 - osc_271igh42的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. matlab eval函数_matlab自动给变量命名
  10. python——学习笔记3