【洛谷P1037】 产生数

产生数

题目链接

本着“水题不可大做”的原则,我直接字符串hash+爆搜,成功爆栈。。

我们发现,依次搜索每一位能取到的数字个数,最后乘起来即可(乘法原理)

然后又爆了一个点。。

long long存不下!!

于是我面向数据编程,看到输出的数后面有很多0 

就产生了这个神奇的骗分做法

 

#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
#define mod 19260817
#define int long long
int n,k,head[10],next[20],to[20],cnt;
int ans=1;
char s[32];
bool vis[10];
inline void add(int x,int y){
    to[++cnt]=y;
    next[cnt]=head[x];
    head[x]=cnt;
}
int dfs(int t){
    if(vis[t]) return 0;
    vis[t]=1;
    int cnt=1;
    for(int i=head[t];i;i=next[i])
     cnt+=dfs(to[i]);
    return cnt;
}
#undef int
int main()
#define int long long
{
    scanf("%s%lld",s+1,&k);
    n=strlen(s+1);
    int x,y;
    for(int i=1;i<=k;i++){
        scanf("%lld%lld",&x,&y);
        add(x,y);
    }
    int tot=0;
    for(int i=1;i<=n;i++){
        memset(vis,0,sizeof(vis));
        ans*=dfs(s[i]-'0');
        while(ans%10==0){
            ans/=10;
            tot++;
        }
    }
    cout<<ans;
    for(int i=1;i<=tot;i++) cout<<0;
    puts("");
    return 0;
}

 

posted @ 2018-07-24 14:22  yjk  阅读(427)  评论(0编辑  收藏  举报