此题有两种解法:图论或者BFS
产生数的题址,相信是个人都能读懂。
两种方法都讲一下
本人太菜,BFS超时,所以先讲图论
解法一:图论
直接上代码:
for(int i=0;i<n;i++) //for 1 to n 也行
{
cin>>x>>y;//读进来规则 假设读进来2 5
GA[x][y]=1;//2行5列打个勾,表示2能变5。(把GA做成bool也行)
}
for(int k=1;k<=9;k++)//k是中间人
for(int i=0;i<=9;i++)//i是规则左部,可以为0
for(int j=1;j<=9;j++)//j是规则右部,不可以是0
if(GA[i][k] && GA[k][j])//如果i可以变成k,k可以变成j
GA[i][j]=1;//那么i也可以变成j
//这就是图论中的Floyd算法 ```cpp
for(int i=0;i<10;i++)//进一步改造
{
GA[i][i]=1;//i能变成i
for(int j=0;j<10;j++)
if(GA[i][j]) d[i]++;//在计算每一个i可以变成多少个花样,存在d[i]中
这道题还涉及到一个高精度计算。
为什么呢?来让我给你比划一下:
对于每一个数 i 有九种变法(包括他自己),但题目说 n<10^30,最多有 30位呢!9^30会很大的!!肯定超过 long long
高精度乘法框架:
int c=0;//c是进位
p[0]=1;//p数组存的是高精度结果
for(int i=0;a[i];i++)//表达式2为真,即a[i]为真
{
c=0;