当前位置: 首页 > news >正文

2024浙江省赛A Bingo

记录下 A 题赤石过程 \sout{记录下A题赤石过程} 记录下A题赤石过程

在这里插入图片描述

套着数学外衣的字符串模拟题,首先,题目要求大于 n n n 的最小的 m m m 的倍数或者数字中出现 m m m

大于不好处理,我们给它加 1 1 1 变为大于等于,这样如果就是 + 1 +1 +1 的那个数也可以直接输出

首先我们将 n + 1 n+1 n+1 m m m 的倍数或者 n + 1 n+1 n+1 包含 m m m 的情况判掉,那么剩下的需要加上一些数构造 m m m 的倍数,或者数字中有 m m m 。首先我们会有一个上界,就是构造 m m m 的倍数所需要的数 r g rg rg ,我们加的数不超过 r g rg rg .

m m m 的数位为 j j j

然后我们考虑数字中构造 m m m ,一般的,我们发现其实只要数字最后的 18 18 18 位即可,因为 m ≤ 1 0 9 m\leq10^9 m109,我们每次让后缀从 i i i 开始变成 0 0 0,第 i i i 位之前的 j j j 位变成 m m m ,变成 m m m 也有两种情况一种是那 j j j 位数大于 m m m ,我们需要要让这些位都变成 0 0 0 , 然后再让那 j j j 位变成 m m m ,另一种情况就是那 j j j 位数小于 m m m ,我们只要让他们变成 m m m 即可。

特别的,我们还有一些特殊的情况,通过某些进位,让很前面的数变成 m m m ,那我们就去匹配 m − 1 m-1 m1 ,代价是让后缀全变 0 0 0 的代价,我们只需要找一次,做一次 1 e 6 1e6 1e6 的高精度减法是可以接受的

最后用 n + 1 n+1 n+1 加上我们需要额外加的数 c o s t cost cost 即是答案

还有一个特判,如果 n ≤ m n\leq m nm,答案就是 m m m

#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
using u64 = unsigned long long;
using i128 = __int128;string add(string &a,string &b) {int n = a.size(), m = b.size();int L = max(n, m);string res;res.reserve(L + 1);int carry = 0;for (int i = 0; i < L; ++i) {int da = (i < n ? a[i] - '0' : 0);int db = (i < m ? b[i] - '0' : 0);int sum = da + db + carry;res.push_back(char('0' + (sum % 10)));carry = sum / 10;}if (carry) {res.push_back(char('0' + carry));}//结果自然没有“前导”零的问题,因为倒序,低位在前return res;
}string subtract(const string &a, const string &b) {int n = a.size(), m = b.size();string res;res.reserve(n);int borrow = 0;for (int i = 0; i < n; ++i) {int da = a[i] - '0' - borrow;int db = (i < m ? b[i] - '0' : 0);if (da < db) {da += 10;borrow = 1;} else {borrow = 0;}res.push_back(char('0' + (da - db)));}// 去掉“高位”多余的 0(即倒序串末尾的 '0')while (res.size() > 1 && res.back() == '0') {res.pop_back();}return res;
}u64 to_num(string &s){          //倒着的数字u64 res = 0;for(int i=s.size()-1;i>=0;--i){res = res*10ll+(s[i]-'0');}return res;
}string s;
u64 m,lm,lmminus1,ls,rg=0;
u64 base[22];void solve(){rg=0;//清空 cin>>s>>m;string sm = to_string(m);string mminus1 = to_string(m-1);reverse(s.begin(),s.end());reverse(sm.begin(),sm.end());reverse(mminus1.begin(),mminus1.end());string one = "1";string sadd1 = add(s,one);swap(sadd1,s);//s+=1if(s.size()<=sm.size()){u64 ss= to_num(s),ssm = to_num(sm);if(ss<=ssm){cout<<ssm<<"\n";return;}}ls = s.size(),lm = sm.size(),lmminus1 = mminus1.size();//求可加上界u64 b = 1;for(int i = 0;i<ls;++i){(rg+=(1LL*(s[i]-'0')*b)%m)%=m;(b*=10LL)%=m;}rg = m-rg;if(rg==m){      //已经是倍数reverse(s.begin(),s.end());cout<<s<<"\n";return;}//查看数字中有没有mfor(int i = 0;i+lm-1<ls;++i){string tmp = s.substr(i,lm);u64 tmp_num = to_num(tmp);if(tmp_num==m){reverse(s.begin(),s.end());cout<<s<<"\n";return;}}u64 cost = rg;//从个位匹配m,匹配18位for(int i = 0;i+lm-1<=18&&i+lm-1<ls;++i){string tmp = s.substr(i,lm);            //本来就是反着的u64 tmp_num=to_num(tmp);//cout<<i<<" "<<tmp_num<<" ";if(tmp_num<=m){string tmp2=s.substr(0,i);u64 tmp_num2 = to_num(tmp2);cost = min(cost,(m-tmp_num)*base[i]-tmp_num2);}else{if(i==0) continue;   //如果是个位,没有办法补0string tmp2=string(i+lm,'0')+"1"; //索引是i+lm-1 总数要加1string tmp3 = to_string(m*base[i]);//00000mstring res = subtract(tmp2,tmp3);if(res.size()>18){continue;   //肯定超出上限}else{cost = min(cost,to_num(res));}}}//从十位匹配m-1,找离个位最近的,只做一次for(int i = 1;i+lmminus1-1<ls;++i){string tmp = s.substr(i,lmminus1);if(tmp==mminus1){//匹配上了,花费是最低位j 10^j-后缀string now1 = string(i,'0')+sm; //0000smstring now2;if(i>0) now2=s.substr(0,i)+mminus1;//xxxxxtmpelse now2=mminus1;string res = subtract(now1,now2);if(res.size()>18){break;  //肯定超出上限}else{cost = min(cost,to_num(res));}break;}else continue;}string cost_str = to_string(cost);reverse(cost_str.begin(),cost_str.end());string ans = add(s,cost_str);reverse(ans.begin(),ans.end());cout<<ans<<'\n';
}signed main(){ios::sync_with_stdio(0);cin.tie(0);base[0]=1;for(int i = 1;i<=19;++i) base[i] = base[i-1]*10LL;int t=1;cin>>t;while(t--) solve();return 0;
}

相关文章:

  • AGP8+ fullMode 完全模式混淆闪退
  • 长城智驾重复造轮子
  • TIM输入捕获知识部分
  • 77. 组合
  • SQL进阶知识:七、数据库设计
  • 怎样通过互联网访问内网 SVN (版本管理工具)提交代码更新?
  • 第13章:MCP服务端项目开发实战:向量检索
  • JAVA | 聚焦 OutOfMemoryError 异常
  • 究竟什么是自动化测试?
  • ecovadis认证需要提供哪些文件?ecovadis认证优势是什么?
  • 传感器测量(图片流程)
  • 经典算法 区间统计种类
  • Opencv图像处理:旋转、打包、多图像匹配
  • TinyVue v3.22.0 正式发布:深色模式上线!集成 UnoCSS 图标库!TypeScript 类型支持全面升级!
  • Python 面向对象练习
  • 日内组合策略思路
  • 强化学习(Reinforcement Learning, RL)和深度学习(Deep Learning, DL)
  • 数据结构——栈与队列
  • 简单场景下的目标关联算法:GNN全局最近邻与匈牙利算法
  • 制作一款打飞机游戏20:敌人被击中时的视觉效果
  • 巴印在克什米尔发生交火
  • 《我的后半生》:人生下半场,也有活力重启的可能
  • 公安部知识产权犯罪侦查局:侦破盗录传播春节档院线电影刑案25起
  • 南方医科大学原副校长宁习洲主动投案,接受审查调查
  • 上海咖啡消费有多“嗲”?咖啡馆已逾9000家,咖啡节主市集持续4天
  • 出35万元为副县长的女友凑购房首付,青海一商人被判缓刑