洛谷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;
}