#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const int mod = 1e4+7;
typedef long long ll;
typedef unsigned long long ull;
ll n,x;
int cnt[10];
bool vis[10][10];
void floyed()
{
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][k]&vis[k][j];
}
}
}
}
ll qpow(ll a,ll b,ll p)
{
ll res = 1;
for(;b;b>>=1)
{
if(b&1)
{
res = res*a%p;
}
a = a*a%p;
}
return res;
}
void solve()
{
cin>>x>>n;
ll x2 = x;
while(x2)
{
cnt[x2%10]++;
x2/=10;
}
for(int i=1;i<=n;i++)
{
int xx,yy;
cin>>xx>>yy;
vis[xx][yy]=1;
}
floyed();
// for(int i=0;i<=9;i++)
// {
// for(int j=0;j<=9;j++)
// {
// cout<<vis[i][j]<<' ';
// }
// cout<<'\n';
// }
ll res = 1;
for(int i=0;i<=9;i++)
{
int ct = 0;
for(int j=0;j<=9;j++)
{
if(i==j)continue;
if(vis[i][j])ct++;
}
res = res*qpow(ct+1,cnt[i],mod)%mod;
}
cout<<res<<'\n';
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t=1;
// cin>>t;
while(t--)
{
solve();
}
return 0;
}
小诈骗题,数据量很小可以建图使用floyed判断是否到达i到j

京公网安备 11010502036488号