【图论】产生数

原题传送门

思路


!!!太激动了!!!爆肝了两天,终于TMD的做出来了(貌似不该爆粗口的QAQ,咳咳,这段掐掉!)
这道题考察知识点的范围是真的广。

  • 首先,它考验了理解题目的能力,题目表面很简单,但很多人刚开始都错会了它的意思(包括本蒟蒻)
  • 其次,它考验按照题目码模拟代码的能力,这道题实际上很复杂,失之毫厘就会差之千里,必须仔细认真。
  • 然后,最重要的来了,没有人能想到这样一道纯数字的题竟然要用图论!!!尽管是比较简单的Floyd。
  • 最后,它的数据范围很大,一定要开高精度(考验基本功的时候到了)

总之,这是一道不可多得的好题。思路我就不写了,建议读者独立完成这道超精品题目,真的很值得!!!

Code


#include<iostream>
#include<cstdio>
#include<string>

using namespace std;

int cs[10],ns[10]; 
string n;
int k,k1,k2;
int ans[30]={1,1};
bool tag[16][16]; 

void cheng(int a[],int b)
{
    for(int i=1;i<=a[0];i++)
        a[i]*=b;
    for(int i=1;i<=a[0];i++)
    {
        if(a[i]>=10)
        {
            a[i+1]+=a[i]/10;
            a[i]%=10;
            if(i==a[0]) a[0]++;
        }
    }
}

int main()
{
    //初始化
    ios::sync_with_stdio(false);
    //读入
    cin>>n>>k;
    for(int i=0;i<n.length();i++)
    {
    	ns[n[i]-48]++;
	}
    for(int i=1;i<=k;i++)
    {
    	cin>>k1>>k2;
    	tag[k1][k2]=1;
	}
	for(int k=1;k<=9;k++)
        for(int i=0;i<=9;i++)
            for(int j=1;j<=9;j++)
                if(tag[i][k]&&tag[k][j]) 
					tag[i][j]=1;
	for(int i=0;i<=9;i++)
    {
    	tag[i][i]=1;
		for(int j=0;j<=9;j++)
		{
			if(tag[i][j])
				cs[i]++;
		}	
	}    
	for(int x=0;x<=9;x++)
		for(int i=1;i<=ns[x];i++)
			cheng(ans,cs[x]);
	for(int i=ans[0];i>=1;i--)
    	cout<<ans[i];
    return 0;
}


原文地址:https://www.cnblogs.com/gongdakai/p/11260510.html