蒟蒻求助
  • 板块P1591 阶乘数码
  • 楼主dtrthg
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/7/25 21:52
  • 上次更新2023/11/4 13:19:37
查看原帖
蒟蒻求助
379113
dtrthg楼主2021/7/25 21:52

嘤嘤嘤

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[1010][5010],len[1010],cnt;
/*
数组用于存储1~1000的阶乘,数组len用于存储每个阶乘的长度,累加器cnt用于存储数码出现次数
数组a第二维为阶乘的位数,例如数组第1位开始,并反着存储,则a[5][1]为0,a[5][2]为2,a[5][3]为1 (5的阶乘为120) 
*/
int main()
{
	a[1][1]=1;
	len[1]=1;
	//本人习惯从1开始,大佬勿喷 
	for(int i=2;i<=1000;i++)
	{
		int ws=len[i-1];//先假设i的阶乘长度与上一位相同 
		
		for(int j=1;j<=ws;j++)
		{
			a[i][j]+=a[i-1][j]*i;
/*
将上一位的第j位乘i,例如i=5,则ws=2,循环2次。第一次a[i][1]加上4*5,(4的阶乘为24,反过来为42),第二次a[i][2]加上2*5 
*/ 
			
			if(a[i][j]>9)
			{
				a[i][j+1]=a[i][j+1]+a[i][j]/10;
				a[i][j]%=10;
			}
			
			//处理进位 
		}
		
		ws+=10;//因为乘法可能会进好几位 
		while(a[i][ws-1]==0)
        //如果ws-1位是0,则ws--。把ws减1是因为实际位数会比ws少一位 
		{
			ws--;
		}
		len[i]=ws;
		//位数 (长度) 处理 
	}
//预处理 
	int t;
	cin>>t;
	for(int i=1;i<=t;i++)
	{
		int n,x;
		cin>>n>>x;
		
		for(int j=1;j<=len[n];j++)
		{
			if(a[n][j]==x) cnt++;
		}
		//遍历 
		cout<<cnt<<endl;
	}
	return 0;
}

救救孩子吧QVQ

2021/7/25 21:52
加载中...