CF550C题解
原题传送门
一道模拟题。
前置芝士(写给小学生看的)
结论
8 的整除特征:若末三位为 8 的倍数,则整个数为 8 的倍数。
推导
设 \(n\) 是 \(\geq1000\) 的整数。
\(n = 1000a+b\)
\(\because n\equiv1000a+b\pmod{8 } \ \texttt{且} \ 8\mid 1000a\)
$ \therefore n\equiv b \pmod{8} $
思路
根据结论,我们可以打表出一个数组 mult8,表示字符串下8的倍数。
for(int i=0;i<1000;i+=8){
cout<<'"'<<i<<'"'<<",";
}
mult8 数组:
const string mult8[]={"0","8","16","24","32","40","48","56","64","72","80","88","96","104","112","120","128","136","144","152","160","168","176","184","192","200","208","216","224","232","240","248","256","264","272","280","288","296","304","312","320","328","336","344","352","360","368","376","384","392","400","408","416","424","432","440","448","456","464","472","480","488","496","504","512","520","528","536","544","552","560","568","576","584","592","600","608","616","624","632","640","648","656","664","672","680","688","696","704","712","720","728","736","744","752","760","768","776","784","792","800","808","816","824","832","840","848","856","864","872","880","888","896","904","912","920","928","936","944","952","960","968","976","984","992"};
然后,从数组头循环到数组末。
for(int i=0;i<len;i++){
//......
}
循环里面分情况讨论,如果数组第 i 位是一位数,就循环一遍,搜索是否有它。
if(k.length()==1){
for(int j=0;j<lens;j++){
if(str[j]==k[0]){
cout<<"Yes"<<endl;
cout<<k;
return 0;
}
}
}
如果是两位数就写二重循环,逐位判断是否有它。
if(k.length()==2){
for(int j=0;j<lens;j++){
if(str[j]==k[0]){
for(int q=j+1;q<lens;q++){
if(str[q]==k[1]){
cout<<"Yes"<<endl;
cout<<k;
return 0;
}
}
}
}
}
如果是三位数就用三重循环,逐位判断是否有它。
if(k.length()==2){
for(int j=0;j<lens;j++){
if(str[j]==k[0]){
for(int q=j+1;q<lens;q++){
if(str[q]==k[1]){
for(int t=q+1;t<lens;t++){
if(str[t]==k[2]){
cout<<"Yes"<<endl;
cout<<k;
return 0;
}
}
}
}
}
}
}
(注:上述 k 是 str[i])
由于前面输出过 Yes 之后 return 0 了,最后只要输出 No 就行了。
时间复杂度:\(\mathcal O (n^3m)\)。(n是字符串长度,m是 mult8 长度即125)考虑最坏情况 \(n^3m = 100^3 \times 125 = 1.25 \times 10^8\),不会 TLE。
本题完。

浙公网安备 33010602011771号