原题太长就挂个链接CSP202112-3登机牌条码
代码
#include<bits/stdc++.h>
using namespace std;
vector<int>c;
vector<int>b;
int main()
{
int w=0,s=0,i=0,flag=0,flag1=1,j=0,k=0,x=0;
string a;
cin>>w>>s;
cin>>a;
if(s!=-1)
k=pow(2,s+1);
for(j=0;;j++)
{
if(a[j]=='\0')
break;
if(a[j]>='A'&&a[j]<='Z')
{
if(flag1==2)
{
b.push_back(28);
b.push_back(27);
flag+=2;
}
if(flag1==3)
{
b.push_back(27);
flag++;
}
b.push_back(a[j]-'A');
flag1=1;
flag++;
}
if(a[j]>='a'&&a[j]<='z')
{
if(flag1!=2)
{
b.push_back(27);
flag++;
}
b.push_back(a[j]-'a');
flag1=2;
flag++;
}
if(a[j]>='0'&&a[j]<='9')
{
if(flag1!=3)
{
b.push_back(28);
flag++;
}
b.push_back(a[j]-'0');
flag1=3;
flag++;
}
}
if(flag%2!=0)
{
b.push_back(29);
flag=flag/2+1;
}
x=w-(flag+1+k)%w;
c.push_back(flag+1+x);
for(i=0,j=1;j<=flag;i=i+2,j++)
{
c.push_back(b[i]*30+b[i+1]);
}
for(i=0;i<x;i++)
c.push_back(900);
if(k!=0)
{
vector<int> gx(k+1);
for( i=0;i<k+1;i++)
gx[i] = 0;
gx[k] = -3;
gx[k-1] = 1;
int temp = -9;
for( i=0;i<k-1;i++)
{
vector<int> tt(k+1);
for( j = k-i-1;j<=k;j++)
tt[j] = gx[j];
for( j=k-i-1;j<=k;j++)
{
gx[j] = ((gx[j] % 929) * (temp % 929))%929;
}
for(j=k-i-1;j<k;j++)
{
gx[j] = (gx[j] %929 + tt[j+1]%929)%929;
}
gx[k-i-2] = 1;
temp *= 3;
temp %= 929;
}
vector<int>dx(c.size()+k,0);
for(i=0;i<c.size();i++)
{
dx[i]=c[i]%929;
}
for(i=0;i<c.size();i++)
{
int t=dx[i];
for(j=0;j<gx.size();j++)
{
dx[i+j] =(dx[i+j]-(gx[j]*t)%929)%929;
}
}
for(i=dx.size()-gx.size()+1;i<dx.size();i++)
{
if(-dx[i]<0)
c.push_back(929+(-dx[i]%929));
else
c.push_back(-dx[i]%929);
}
}
for(i=0;i<c.size();i++)
{
cout<<c[i]<<endl;
}
return 0;
}