0neKbyte @ 2024-10-27 19:45:21
#include<iostream>
using namespace std;
int num1[10005], num2[10005], times, w1, w, sum;
int main(){
int t;
scanf("%d", &t);
int n[t]={}, a[t]={};
for(int i=0; i<t; i++){
scanf("%d %d", &n[i], &a[i]);
}num1[0]=1;
for(int i=1; ; i++){
for(int o=0; o<=w1; o++){
num2[o]=num1[o];
num1[o]=0;
}for(int o=0; o<=w1; o++){
num1[o]+=(num2[o]*i);
if(num1[o]>=10){
num1[o+1]=num1[o]/10;
num1[o]=num1[o]%10;
}
if(num1[o+1]){
w=max(o+1, w1);
}
}w1=w;
for(int j=0; j<t; j++){
if(i==n[j]){
sum=0;
times++;
for(int p=0; p<=w; p++){
if(num1[p]==a[j]) sum++;
}printf("%d\n", sum);
}
}if(times==t)return 0;
}
}
by wuyusheng @ 2024-10-27 19:59:56
@0neKbyte 你的代码用的是高精吗,怎么看不懂?
by wuyusheng @ 2024-10-27 20:00:21
@0neKbyte 我的代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,n,a1[3000],cnt[2000],t;
cin>>t;
int t2=t;
while(t--)
{
memset(a1,0,sizeof(a));
cin>>n>>a;
a1[1]=1;
int l=1,j,jw=0;
for(int i=1; i<=n; i++)
{
jw=0;
for(j=1;j<=l;j++)
{
a1[j]=a1[j]*i+jw;
jw=a1[j]/10;
a1[j]=a1[j]%10;
}
while(jw!=0)
{
a1[j]=jw%10;
jw/=10;
j++;
}
l=j-1;
}
for(int i=1; i<=l; i++)
{
if(a1[i]==a)
cnt[t2-t]++;
}
}
for(int i=1; i<=t2; i++)
{
cout<<cnt[i]<<endl;
}
return 0;
}
by 0neKbyte @ 2024-10-27 20:49:59
@wuyusheng 是高精,但是我改了一下
num1是乘运算后的结果
每次num2乘以i,最后赋值给num1.w1和w是num1的位数
每当i等于列表n的某一个数值时统计a出现的次数,本质过程我们差不多,只不过你每次都把al重置重新算罢了