(搜索)洛谷P1037产生数

洛谷P1037产生数

思路:

我们很容易看出结果是每个位数能变化的次数(包括他自身)的乘积。
然后我就用bfs找每个位数能变化几次,TLE了。
对于dfs并不擅长,看来其他的题解,发现floyd也可以解决问题。floyd可以理解为i是否能通过转换到k之后转换到j。
最后发现答案最大时1030,肯定会超long long。写一个高精度乘低精度就能行了。

代码:

#include<bits/stdc++.h>
#define pii pair<int,int>
#define ll long long
#define cl(x,y) memset(x,y,sizeof(x))
#define ct cerr<<"Time elapsed:"<<1.0*clock()/CLOCKS_PER_SEC<<"s.\n";
const int N=1e6+10;
const int mod=1e7+9;
const int maxn=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
const int inf=99999999;
using namespace std;
string s;
int a[10][10]={0},num[10]={0},ans[50]={0},len=0;
void ti(int x)
{
	int i;
	for(i=0;i<=len;i++)
		ans[i]*=x;
	for(i=0;i<=len;i++)
	{
		if(ans[i]>=10)
		{
			ans[i+1]+=ans[i]/10;
			ans[i]%=10;
		}
	}
	while(ans[len]>0)
	{
		ans[len+1]+=ans[len]/10;
		ans[len]%=10;
		len++;
	}
}
void print(__int128 x)
{
	if(x>9)
		print(x/10);
	putchar(x%10+'0');
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int k,i,j,l;
	cin>>s>>k;
	for(i=1;i<=k;i++)
	{
		int x,y;
		cin>>x>>y;
		a[x][y]=1;
	}
	for(i=0;i<=9;i++)
		for(j=0;j<=9;j++)
			for(l=0;l<=9;l++)
				if(a[j][i]&& a[i][l]) 
					a[j][l]=1;
	ans[0]=1;
	for(i=0;i<=9;i++)
	{
		a[i][i]=1;
		for(j=0;j<=9;j++)
			num[i]+=a[i][j];
	}
	for(i=0;i<s.length();i++)
		ti(num[s[i]-'0']);
	for(i=len-1;i>=0;i--)
		cout<<ans[i];
	return 0;
}

发布了119 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Z7784562/article/details/104142395