原题链接: https://codeforces.com/contest/1288/problems
测试样例
Input
3
1 11
4 2
191 31415926
Output
1
0
1337
Note
There is only one suitable pair in the first test case: a=1, b=9 (1+9+1⋅9=19).
题意: 给你一个整数A和B,让你从1~ A中选出一个整数a, 1~B中选出一个整数b,要符合条件 ( a ∗ b + a + b ) = = c o n c ( a , b ) (a*b+a+b)==conc(a,b) (a∗b+a+b)==conc(a,b),其中 c o n c ( a , b ) conc(a,b) conc(a,b)即连接 a a a和 b : a b b:ab b:ab。让你求出有多少组这样的组合。
解题思路: 一道妥妥的数学+思维问题。由于连接 a a a和 b b b是不属于数学的表达,我们可以设 b b b的位数为num。那么 a b ab ab即可表示为 a ∗ 1 0 n u m + b a*10^{num}+b a∗10num+b,我们将此式代回原式可得 b + 1 = 1 0 n u m b+1=10^{num} b+1=10num, 我们发现要使得这个式子满足的条件只关心 b b b的值, a a a取什么都行。我们再观察 1 0 n u m 10^{num} 10num只可能是10、100···,那么转换之后也就是说我们要判断位数上都是9的数字有多少个。之后与 a a a的范围相乘即可。OK,具体看代码。
AC代码
/*
*邮箱:unique_powerhouse@qq.com
*blog:https://me.csdn.net/hzf0701
*注:文章若有任何问题请私信我或评论区留言,谢谢支持。
*
*/
#include<bits/stdc++.h> //POJ不支持
#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair
using namespace std;
const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 1e5;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为自定义代码模板***************************************//
ll t,a,b;
void solve(){
ll cnt=0,temp=9;
while(b>=temp){
temp=temp*10+9;
cnt++;
}
//得到位数都是9的数量。
cout<<a*cnt<<endl;
}
int main(){
//freopen("in.txt", "r", stdin);//提交的时候要注释掉
IOS;
while(cin>>t){
while(t--){
cin>>a>>b;
solve();
}
}
return 0;
}