题意
给出一个n,求a(1<=a<=10000)范围中,用字符串方式计算n*a-b(将a个字符串n连接在一起,然后删除最后的b个字符)与正常计算n*a-b的结果相同的a与b有多少种情况,并输出,每组a和b。
思路
a的范围是1e5,直接将a遍历一遍,再手动构造符合条件的字符串(n*a-b),将其位数与正常计算的结果位数进行比较,若位数相同则两种方式结果相同,复合条件。
代码
void solve() {
int n=read();
int n1=n;
string s;
while(n1){//将n转化为字符串,便于构造
s=(char)('0'+n1%10)+s;
n1/=10;
}
vector<pll>Ans;//存放符合条件的a和b
for(int a=1;a<=10000;a++){
int num=0;
int nn=n;
while(nn)num++,nn/=10;//计算现在n有多少位
int res=n;//res是构造出的结果
int ans=num;
int e=0;//用于判断当前需要添加哪一位
int x=n*a;
int b=x-res;
int ws=num*a-b;//位数
if(ws==ans&&b>=1){
Ans.push_back({a,b});
}
while(res*10+(s[e%num]-'0')<x){//构造结果,不能比n*a大
res=res*10+(s[e%num]-'0');
ans++;
e++;
b=x-res;
ws=num*a-b;
if(ws==ans&&b>=1){
Ans.push_back({a,b});
}
}
}
cout<<Ans.size()<<endl;
for(auto i:Ans){
cout<<i.first<<' '<<i.second<<endl;
}
}