P1037 [NOIP2002 普及组] 产生数
作者:
闪回
,
2024-03-30 22:16:44
,
所有人可见
,
阅读 3
高精度+bool型floyd
#include<bits/stdc++.h>
using namespace std;
const int N = 20;
bool vis[N][N];
int f[N];
string n;
int k;
void floyd()
{
for(int k = 0;k<=9;k++)
for(int i = 0;i<=9;i++)
for(int j = 0;j<=9;j++)
{
vis[i][j] = vis[i][j] || (vis[i][k] && vis[k][j]);
}
}
vector<int> mul(vector<int> &num,int x)
{
int t = 0;
vector<int> temp;
for(int i = 0;i<num.size();i++)
{
t += num[i] * x;
temp.push_back(t % 10);
t /= 10;
}
while(t)
{
temp.push_back(t % 10);
t /= 10;
}
while(temp.back() == 0 && temp.size() > 1)temp.pop_back();
return temp;
}
int main()
{
cin>>n>>k;
while(k--)
{
int x,y;
cin>>x>>y;
vis[x][y] = true;
}
for(int i = 0;i<=9;i++)vis[i][i] = true;
floyd();
for(int i = 0;i<=9;i++)
for(int j = 0;j<=9;j++)
{
if(vis[i][j])f[i]++;
}
vector<int> num;
num.push_back(1);
for(int i = 0;i<n.size();i++)
{
int x = n[i] - '0';
num = mul(num,f[x]);
}
for(int i = num.size()-1;i>=0;i--)cout<<num[i];
return 0;
}