zoukankan      html  css  js  c++  java
  • [洛谷P1037][题解]产生数

    这道题的关键是利用Floyd算法的性质求转换方案,算是Floyd的一个变形,具体可以看代码。

    题目

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 string n;
     4 int k;
     5 
     6 bool f[15][15];//表示数字之间是否能转换 
     7 inline void FLOYD()
     8 {
     9     /*
    10     这里用Floyd算法枚举所有数对及中间的切点 
    11     如果i能到k而k能到j
    12     则说明i能到j 
    13     */
    14     for(int k=1;k<10;k++){
    15         for(int i=0;i<10;i++){
    16             for(int j=1;j<10;j++){
    17                 if(f[i][k]&&f[k][j])f[i][j]=1;
    18             }
    19         }
    20     }
    21 }
    22 
    23 int cnt[15];
    24 inline void SOLVE()
    25 {
    26     /*
    27     计算每个数字能变为多少种 
    28     */
    29     for(int i=0;i<10;i++){
    30         f[i][i]=1;
    31         for(int j=0;j<10;j++){
    32             if(f[i][j])cnt[i]++;
    33         }
    34     }
    35 }
    36 
    37 int num[505];//高精警告
    38  
    39 int main()
    40 {
    41     ios::sync_with_stdio(0);
    42     cin>>n>>k;
    43     for(int i=1;i<=k;i++){
    44         int x,y;
    45         cin>>x>>y;
    46         f[x][y]=1;
    47     }
    48      
    49     FLOYD();
    50     SOLVE();
    51     
    52     int c=0;
    53     num[0]=1;
    54     for(int i=0;n[i];i++){
    55         c=0;
    56         int ss=cnt[n[i]-'0'];
    57         //万恶的高精 
    58         for(int j=0;j<500;j++){
    59             num[j]=num[j]*ss+c;
    60             c=num[j]/10;
    61             num[j]%=10;
    62         }
    63     }
    64     //还是万恶的高精 
    65     int i=500;
    66     while(num[i]==0)i--;
    67     for(;i>=0;i--)cout<<num[i];
    68     cout<<endl;
    69     return 0;
    70 }
  • 相关阅读:
    <魔域>按键精灵脚本
    Windows下Java环境变量配置
    JDBC简单范例
    迅雷高速通道被举报无法下载问题
    wifi入侵思路
    连接WiFi工具类
    ActionBar+Fragment实现顶部标签页
    Fragment的基本用法
    opencv-python识别人脸
    string.Join 拼接在sql中特殊处理
  • 原文地址:https://www.cnblogs.com/juruoajh/p/11786000.html
Copyright © 2011-2022 走看看