思路
!!!太激动了!!!爆肝了两天,终于TMD的做出来了(貌似不该爆粗口的QAQ,咳咳,这段掐掉!)
这道题考察知识点的范围是真的广。
- 首先,它考验了理解题目的能力,题目表面很简单,但很多人刚开始都错会了它的意思(包括本蒟蒻)
- 其次,它考验按照题目码模拟代码的能力,这道题实际上很复杂,失之毫厘就会差之千里,必须仔细认真。
- 然后,最重要的来了,没有人能想到这样一道纯数字的题竟然要用图论!!!尽管是比较简单的Floyd。
- 最后,它的数据范围很大,一定要开高精度(考验基本功的时候到了)
总之,这是一道不可多得的好题。思路我就不写了,建议读者独立完成这道超精品题目,真的很值得!!!
Code
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int cs[10],ns[10];
string n;
int k,k1,k2;
int ans[30]={1,1};
bool tag[16][16];
void cheng(int a[],int b)
{
for(int i=1;i<=a[0];i++)
a[i]*=b;
for(int i=1;i<=a[0];i++)
{
if(a[i]>=10)
{
a[i+1]+=a[i]/10;
a[i]%=10;
if(i==a[0]) a[0]++;
}
}
}
int main()
{
//初始化
ios::sync_with_stdio(false);
//读入
cin>>n>>k;
for(int i=0;i<n.length();i++)
{
ns[n[i]-48]++;
}
for(int i=1;i<=k;i++)
{
cin>>k1>>k2;
tag[k1][k2]=1;
}
for(int k=1;k<=9;k++)
for(int i=0;i<=9;i++)
for(int j=1;j<=9;j++)
if(tag[i][k]&&tag[k][j])
tag[i][j]=1;
for(int i=0;i<=9;i++)
{
tag[i][i]=1;
for(int j=0;j<=9;j++)
{
if(tag[i][j])
cs[i]++;
}
}
for(int x=0;x<=9;x++)
for(int i=1;i<=ns[x];i++)
cheng(ans,cs[x]);
for(int i=ans[0];i>=1;i--)
cout<<ans[i];
return 0;
}