luogu P1037 产生数
原题链接:https://www.luogu.org/problem/show?pid=1037
首先,我不知道标签的搜索是哪里来的,这明明就是个Floyd+乘法原理
首先0—9每个数自己想自己连边,然后读入给出的边,跑一边Floyd,因为此题并没有要求步数的要求,所以只需要记录能否到达即可。1为能到达。
然后统计每一个数字都能到达几个数字(本身也算),将所有结果乘起来,用高精度处理一下就好了
#include<cstdio> #include<cstring> int n,e[20][20]; int num[20],ans[50],l; char a[50]; int main() { scanf("%s %d",a,&n); for(int i=1;i<=n;i++) { int x,y; scanf("%d %d",&x,&y); e[x][y]=1; } for(int i=0;i<=9;i++) e[i][i]=1; for(int k=0;k<=9;k++) { for(int i=0;i<=9;i++) { for(int j=0;j<=9;j++) { if(e[i][k]==1&&e[k][j]==1) e[i][j]=1; } } } int len=strlen(a); for(int i=0;i<len;i++) { int s=a[i]-'0'; for(int j=0;j<=9;j++) { if(e[s][j]==1) num[i]++; } } ans[0]=1; for(int i=0;i<len;i++) { for(int j=0;j<=l;j++) ans[j]*=num[i]; for(int j=0;j<=l;j++) { if(ans[j]>9) { ans[j+1]+=ans[j]/10; ans[j]%=10; } } if(ans[l+1]!=0) l++; } for(int i=l;i>=0;i--) printf("%d",ans[i]); return 0; }