pppwolf @ 2023-06-07 13:25:46
求助!!用的字符串,TLE了两个 4 和 10,其他都AC
#include <iostream>
#include <cstring>
using namespace std;
void init_string(string &s1, string &s2)
{
int len1 = s1.size();
int len2 = s2.size();
int num = abs(len1 - len2);
if (len1 < len2)
{
while (num--)
{
s1 = '0' + s1;
}
}
else if (len1 > len2)
{
while (num--)
{
s2 = '0' + s2;
}
}
}
// 高精度加法
string add(string s1, string s2)
{
init_string(s1, s2);
int op = 0; // 进位
string ans = "";
for (int i = s1.size() - 1; i >= 0; i--)
{
int temp = (s1[i] - '0') + (s2[i] - '0') + op;
op = temp / 10;
temp %= 10;
ans = char(temp + '0') + ans;
}
if (op != 0)
ans = char(op + '0') + ans;
return ans;
}
// 高精度乘低精度
string mul_low(string s1, int x)
{
int num = 0;
string ans = "";
while (x)
{
int temp = x % 10;
int op = 0;
string tempstr;
for (int i = s1.size() - 1; i >= 0; i--)
{
int tem = (temp * (s1[i] - '0') + op) % 10;
op = (temp * (s1[i] - '0') + op) / 10;
tempstr = char(tem + '0') + tempstr;
}
if (op != 0)
tempstr = char(op + '0') + tempstr;
for (int i = 0; i < num; i++)
tempstr += '0';
ans = add(ans, tempstr);
x /= 10;
num++;
}
ans.erase(0, ans.find_first_not_of('0')); // 去除前导0
if (ans.empty())
ans = "0";
return ans;
}
int main()
{
int n;
cin >> n;
while (n--)
{
int a, b, ans = 0;
string str = "1";
cin >> a >> b;
for (int i = 1; i <= a; i++)
{
str = mul_low(str, i);
}
for (int i = 0; i < str.size(); i++)
{
if (str[i] == char(b + '0'))
ans++;
}
cout << ans << endl;
}
return 0;
}
by ninji @ 2023-06-07 14:13:12
记录 @pppwolf
帮你卡到90分
by pppwolf @ 2023-06-07 15:14:02
@ninji 还有一个怎么优化呢
by ninji @ 2023-06-07 15:18:42
@pppwolf 不大清楚。(可以与题解对拍一下)
by ninji @ 2023-06-07 15:24:32
@pppwolf 这我的AC代码:
#include <bits/stdc++.h>
using namespace std;
int a[2600],t,n,q,s;//存放数组
int main()
{
cin>>t;//输入数据组数
for(int k=1;k<=t;k++)
{
s=0;//归0
cin>>n>>q;
memset(a,0,sizeof(a));//别忘了清零!!!
a[0]=1;//1!=1
for(int i=1;i<=n;i++)
{
int x=0;//进位数
for(int j=0;j<=2599;j++)
{
a[j]=a[j]*i+x;//高精
x=a[j]/10;//进位
a[j]%=10;
}
}
bool f=0;//做标记
for(int j=2599;j>=0;j--)//去除前缀0
{
if(a[j]!=0)//非0,开始
{
f=1;//标记为真
}
if(f)
//f为真,开始判断
{
if(a[j]==q)//相同
{
s++;
}
}
}
cout<<s<<endl;
}
return 0;
}