ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CSP 202112-3 登机牌条码 100分题解

2022-03-27 09:33:25  阅读:257  来源: 互联网

标签:题解 back long 202112 v3 v4 登机牌 push define


分析:

一步步按照它的要求来就是了。
多项式除法的过程要手动模拟(有点像高精度)。

一开始我50分,是只对答案取了模没对过程取模。
然后80分,发现3^k其实会爆long long。

注意每一处的细节(要不要取模)

代码

#include <bits/stdc++.h>

using namespace std;

#define File(x) freopen("(x)","r",stdin)
#define pf prlong longf
#define ull unsigned long long
#define db double
#define ll long long
#define MAXN  
long long w,s,f;
string x;
vector<long long>v;

int main(){
   cin>>w>>s>>x;

   long long tp=0;

   for(long long i=0;i<x.length();i++){
      if(x[i]>='A'&&x[i]<='Z'){
            if(tp==1){
            v.push_back(28);
            v.push_back(28);
         }
         else if(tp==2){
            v.push_back(28);                     
         }
         tp=0;
         v.push_back(x[i]-'A');
      }
      else if(x[i]>='a'&&x[i]<='z'){
         if(tp==0||tp==2)v.push_back(27);
         v.push_back(x[i]-'a');
         tp=1;
      }
      else {
         if(tp!=2)v.push_back(28);
         tp=2;
         v.push_back(x[i]-'0');
      }
   }

   if(v.size()%2){
      v.push_back(29);
   }
   vector<long long>v2;
   for(long long i=0;i<v.size();i+=2){
      v2.push_back(v[i]*30+v[i+1]);
   }
   
   long long len=v2.size()+1;
   if(s==-1){
      while(len%w){
         v2.push_back(900);
         ++len;
      }
      cout<<len<<endl;
      for(auto x:v2)cout<<x<<endl;
      return 0;
   }
   while((len+(1<<(s+1)))%w){
      ++len;
      v2.push_back(900);
   } 
 
   vector<long long>v3;
   v3.push_back(len);
   for(auto X:v2){
      v3.push_back(X);
   }
     for(auto x:v3)printf("%d\n",x);

   vector<long long>v4;
   v4.push_back(1);
   v4.push_back(-3);
   
   long long mul=-3;

   for(long long i=2;i<=(1<<(s+1));i++){
      v4.push_back(0);
      mul=mul*3%929; 
      for(long long j=v4.size()-1;j>=1;j--)v4[j]+=v4[j-1]*mul%929,v4[j]%=929;
   }  
      long long w4=1<<(s+1);
      for(long long i=1;i<=w4;i++) v3.push_back(0);
      for(long long i=0;i<v3.size();i++){
          long long num=v3[i]; 
          for(long long j=i+1;j<=i+w4;j++)v3[j]-=num*v4[j-i]%929,v3[j]%=929;
          if(i==v3.size()-w4-1){ f=i+1; break; }    
      }
      while(f<v3.size()){ 
      long long ans1=(-v3[f])%929;  
      if(ans1<0)ans1+=929; 
      cout<<ans1<<endl;
      ++f;
      } 
      return 0;
}

 

标签:题解,back,long,202112,v3,v4,登机牌,push,define
来源: https://www.cnblogs.com/GUOGaby/p/16061917.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有