CF1288
Educational Codeforces Round 80 (Rated for Div. 2)
A略
CF1288B
CF1288B题意
-
给定 \(A,B\),问有多少个二元组 \((a,b)\) 满足 \(1\le a \le A,1\le b\le B\) 且 \(a\cdot b+a+b=\operatorname{conc}(a,b)\)。其中 \(\operatorname{conc}(a,b)\) 表示将 \(a,b\) 拼接在一起,比如 \(\operatorname{conc}(12,23)=1223,\operatorname{conc}(100,11)=10011\),\(a,b\) 不能含有前导 \(0\)。
-
本题有多组数据。令数据组数为 \(T\),\(T\le 100\),\(A\le 10^9\),\(B\le 10^9\)。
CF1288B题解
不妨设 \(b\) 的位数是 \(count(b)\)。
那么有
发现这个式子与 \(a\) 无关,成立当且仅当 \(b=10^k-1\)。
不难发现这样的 \(b\) 形如 \(9,99,999,\dots,999\dots999\)(设成立的总数是 \(f(b)\))。
而只要 \(b\) 满足了,\(a\) 是什么都无所谓,答案就是 \(a\times f(b)\)。
没了。
CF1288B代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x = 0, f = 1;char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}
while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
return x * f;
}
signed main(){
int T = read();
while(T--){
int a = read(), b = read();
int cnt = 0,tmp = 1;
while(tmp - 1 <= b){tmp *= 10;cnt++;}
if(cnt)cnt--;
printf("%lld\n",a * cnt);
}
return 0;
}
标签:CF1288,10,ch,题解,conc,times,le,CF1288B
From: https://www.cnblogs.com/Call-me-Eric/p/17872588.html