统计一下 aaa ⋯ aaan个a × b 的结果里面有多少个数字d,a,b,d均为一位数。
样例解释:
3333333333*3=9999999999,里面有10个9。
Input
多组测试数据。 第一行有一个整数T,表示测试数据的数目。(1≤T≤5000) 接下来有T行,每一行表示一组测试数据,有4个整数a,b,d,n。 (1≤a,b≤9,0≤d≤9,1≤n≤10^9)
Output
对于每一组数据,输出一个整数占一行,表示答案。
Input示例
2 3 3 9 10 3 3 0 10
Output示例
10 0
一开始自己就发现了,中间都是重复的,所以只需要模拟很少的就可以了,所以就模拟了半天,发现一直WA,看了输入数据,知道了,情况不是自己想的那么简单,
3333*3=9999
3333*9=29997
8888*7=62216
我是真没有分析到,还有第三种这种情况,还会进两位,我的重复都是取得num[1],所以就错了好多遍。
但是自己应该错了,就去分析我们可能的情况,还有就是情况的分类,自己做的很烂,导致思路都很混乱。还有就是记忆化忘了数组的存储,还扫了好多遍,不是直接存取,当然每次都得memset
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
int num[10];
int main()
{
int a,b,d,n,s;
int T;
scanf("%d",&T);
while(T--){
scanf("%d %d %d %d",&a,&b,&d,&n);
memset(num,0,sizeof(num));//忘了 QAQ
if(n<=5){
s=0;
while(n--){
s=s*10+a;
}
s*=b;
while(s){
num[s%10]++;
s/=10;
}
}
else{
s=0;
int t=5;
while(t--){
s=s*10+a;
}
s*=b;
int ge=s%10;
int shi=(s/10)%10;
int bai=(s/100)%10;
s=s/1000;
while(s)
{
num[s%10]++;
s/=10;
}
num[ge]++;num[bai]++;num[shi]++;num[bai]+=n-5;
}
printf("%d\n",num[d]);
}
return 0;
}
没用数组记忆化,做的很烂
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
int a,b,d,n;
int num[10],ans[10];
int main()
{
int T;
scanf("%d",&T);
while(T--) {
scanf("%d %d %d %d",&a,&b,&d,&n);
if(a*b<10) {
if(d==a*b)
printf("%d\n",n);
else
printf("0\n");
continue;
} else {
int cnt=0,c=0,ed=0;
if(n<10) {
for(int i=0; i<n; i++)
num[i]=a*b;
for(int i=0; i<n; i++) {
ans[cnt++]=(c+num[i])%10;
c=(c+num[i])/10;
}
if(c) ans[cnt++]=c;
for(int i=0; i<cnt; i++)
if(ans[i]==d)
ed++;
} else {
for(int i=0; i<10; i++)
num[i]=a*b;
for(int i=0; i<10; i++) {
ans[cnt++]=(c+num[i])%10;
c=(c+num[i])/10;
}
if(c) ans[cnt++]=c;
if(d==ans[9]) {
for(int i=0; i<cnt; i++) if(ans[i]==d)ed++;
ed+=n-10;
} else {
if(ans[cnt-1]==d)ed++;
if(ans[0]==d) ed++;
if(ans[1]==d) ed++;
}
}
printf("%d\n",ed);
}
}
return 0;
}