日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

产生数(Floyd)

發布時間:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 产生数(Floyd) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

給出一個整數 n(n<10^30) 和 k 個變換規則(k<=15)。
  規則:
   一位數可變換成另一個一位數:
   規則的右部不能為零。
  例如:n=234。有規則(k=2):
    2-> 5
    3-> 6
  上面的整數 234 經過變換后可能產生出的整數為(包括原數):
   234
   534
   264
   564
  共 4 種不同的產生數
問題:
  給出一個整數 n 和 k 個規則。
求出:
  經過任意次的變換(0次或多次),能產生出多少個不同整數。
  僅要求輸出個數。

Input

n k
x1 y1
x2 y2
… …
xn yn

Output

一個整數(滿足條件的個數):

Sample Input
234 2
2 5
3 6

Sample Output
4
.
.
.
.
.

分析

把被轉化的數設為一條有向邊的起始點,轉化成的數作為終點,這題很明顯就是要求n數位上所有數能達到的點的個數的乘積 。

但是

我們再看一下數據,我們發現:乘積可能達到10^30!!!
所以,我們要用高精乘
.
.
.
.
.
.

程序:
#include<iostream> using namespace std; int f[10][10]; int k,ans[500]={1},l=1; void wk(int x) {for (int i=0;i<l;i++)ans[i]*=x;for (int i=0;i<l;i++)if (ans[i]>=10){ans[i+1]+=ans[i]/10;ans[i]%=10;}while (ans[l]>0){ans[l+1]=ans[l]/10;ans[l]=ans[l]%10;l++;} } int main() {string s;cin>>s>>k;int x,y,len;int t[10];for (int i=1;i<=k;i++) { cin>>x>>y;f[x][y]=1; }for (int i=0;i<=9;i++)f[i][i]=1;for (int k=1;k<=9;k++) for (int i=0;i<=9;i++)for (int j=1;j<=9;j++)if (f[i][k]==1&&f[k][j]==1) f[i][j]=1;for (int i=0;i<=9;i++){ int tj=0;for (int j=0;j<=9;j++)if (f[i][j]==1) tj++;t[i]=tj;}for (int i=0;i<s.length();i++) wk(t[s[i]-'0']); for (int i=l-1;i>=0;i--) cout<<ans[i];return 0; }

轉載于:https://www.cnblogs.com/YYC-0304/p/9499959.html

總結

以上是生活随笔為你收集整理的产生数(Floyd)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。