2021“MINIEYE杯”中国大学生算法设计超级联赛(8)(1002,1004,1006,1009)
前言
依旧是白嫖账号,只打了一些题/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\)块钱的方案那么有
\]
然后化成生成函数就是
\]
和之前一道倍增\(FFT\)很像,然后考虑分割位置填两个就是\(F_{1}(x)=1+x+x^2\),然后
\]
上倍增\(FFT\)就好了。
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
题目大意
\(n\)个数字要求支持操作
- 将一个区间所有数字的最低位减去
- 将一个区间非零数字的最高位提高一位
每次操作玩输出操作区间的和
\(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
#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
题目大意
给一个字符串\(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
#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)的更多相关文章
- 2021“MINIEYE杯”中国大学生算法设计超级联赛(7)部分题解
前言 找大佬嫖到个号来划水打比赛了,有的题没写或者不是我写的就不放了. 目前只有:1004,1005,1007,1008,1011 正题 题目链接:https://acm.hdu.edu.cn/con ...
- 2022“杭电杯”中国大学生算法设计超级联赛(6)- 1011 Find different
2022"杭电杯"中国大学生算法设计超级联赛(6)- 1011 Find different 比赛时队友开摆,还剩半个小时,怎么办?? 当然是一起摆 Solution 看到这个题没 ...
- 3I工作室的成员在2013年(第6届)中国大学生计算机设计大赛总决赛中荣获全国二等奖
在暑假举行的2013年(第6届)中国大学生计算机设计大赛中,我院的参赛作品<毕业生论文选导系统>(作者:祝丽艳/许明涛:指导老师:元昌安/彭昱忠)入围总决赛,并荣获全国二等奖. 2013年 ...
- 2016年中国大学生程序设计竞赛(合肥)-重现赛1009 HDU 5969
最大的位或 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- "巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场
Combine String #include<cstdio> #include<cstring> #include<iostream> #include<a ...
- hdu_5705_Clock("巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5705 题意:给你一个时间和一个角度,问你下一个时针和分针形成给出的角度是什么时候 题解:我们可以将这个 ...
- hdu_5707_Combine String("巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5707 题意:给你三个字符串 a,b,c,问你 c能否拆成a,b,a,b串的每一个字符在c中不能变 题解 ...
- 2017年“嘉杰信息杯” 中国大学生程序设计竞赛全国邀请赛 Highway
Highway Accepted : 122 Submit : 393 Time Limit : 4000 MS Memory Limit : 65536 KB Highway In ICPC ...
- HDU 6024(中国大学生程序设计竞赛女生专场1002)
这是CCPC女生专场的一道dp题.大佬们都说它简单,我并没有感到它有多简单. 先说一下题意:在一条直线上,有n个教室,现在我要在这些教室里从左到右地建设一些作为糖果屋,每个教室都有自己的坐标xi 和建 ...
随机推荐
- 如何快速排查发现redis的bigkey?4种方案一次性给到你!
本篇文章将以redis的bigkey为主题进行技术展开,通过从认识redis的高性能,bigkey的危害.存在原因.4种解决方案,到模拟实战演练的介绍方式,来跟大家一起认识.探讨和学习redis. 先 ...
- tcp为什么要三次握手,tcp为什么可靠
转自 : https://www.cnblogs.com/LUO77/p/5771237.html大体看过,没有深入研究,有需要时继续看. 为什么不能两次握手:(防止已失效的连接请求又传送到服务器端, ...
- windows通过pfx文件生成key、crt文件
nginx代理的时候,需要填写证书的crt跟rsa文件路径,通过iis导出的证书是pfx文件(不知道nginx能不能直接用pfx文件,没有查看过相关资料),所以要通过pfx文件生成crt.rsa文件. ...
- Javascript - Vue - webpack中的axios
导入axios import Vue from "vue";import axios from "axios";import { get } from &quo ...
- rasa form的中断形式 自然机器语言学习 人工智能
Forms形式 最常见的对话模式之一是从用户那里收集一些信息以便做某事(预订餐厅.调用 API.搜索数据库等).这也称为**槽填充**. 用法# 要在 Rasa Open Source 中使用表单,您 ...
- RHCS集群架构之mysql及共享存储iscsi
server1 172.25.7.1(配置Nginx.ricci和luci) server2 172.25.7.2(Apache.iscsi) server3 172.25.7.3(Apache) s ...
- java交互Scanner类
用next方法接收 import java.util.Scanner; public class Demo01 { public static void main(String[] args) { / ...
- 浅谈可持久化Trie与线段树的原理以及实现(带图)
浅谈可持久化Trie与线段树的原理以及实现 引言 当我们需要保存一个数据结构不同时间的每个版本,最朴素的方法就是每个时间都创建一个独立的数据结构,单独储存. 但是这种方法不仅每次复制新的数据结构需要时 ...
- python代码检查工具(静态代码审查)
python静态代码检查 我们知道python是一门脚本语言,不像C#/Java等编译型语言可以在编译阶段就报出代码错误,脚本语言往往需要在运行期执行到这段代码时才会抛出代码错误. 那么在实际商业项目 ...
- 关于electron-vue打包后静态视频文件无法正常加载的问题解决方法
最近在使用electron-builder构建vue项目的时候发现在生产模式下视频可以正常加载并显示,但是一旦打包到开发环境下,视频就读取不出来了,控制台也并没有报错 一开始博主以为是路径问题,在将路 ...