【洛谷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; }