(搜索)洛谷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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章