「CF464C」Substitutes in Number
题解
简直神题。。。orz无数次jiry_2神的代码才领悟的
题意给定一个数字串,每次把某个数字变成一串数字。。。
最后把数字串当作一个数字,输出其mod1000000007的值
用to[i]表示第i个数字变成的数值(mod),l[i]表示该数字的位数
然后倒序处理这俩个数组,处理过程中使用快速幂
还要注意在变化过程中l[i]可能非常大
这时根据费马小定理,可以取模1000000006
因为a^(p-1) mod p=a^0 mod p
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<map> #include<set> #include<vector> #include<queue> #define pa pair<int,int> #define inf 1000000000 #define mod 1000000007 #define ll long long using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,tot; char ch[100005],t[100005]; int st[100005],ed[100005],a[100005],b[100005]; int to[10],l[10]; ll qpow(ll a,ll b) { ll ans=1; for(ll i=b;i;i>>=1,a=(a*a)%mod) if(i&1)ans=(ans*a)%mod; return ans; } int main() { scanf("%s",ch+1); for(int i=0;i<=9;i++)l[i]=1,to[i]=i; n=read(); for(int i=1;i<=n;i++) { scanf("%s",t+1); a[i]=t[1]-'0'; int len=strlen(t+1); if(len==3)st[i]=1; else { st[i]=tot+1; for(int j=4;j<=len;j++)b[++tot]=t[j]-'0'; ed[i]=tot; } } for(int i=n;i;i--) { ll t=0,len=0; for(int j=st[i];j<=ed[i];j++) { t=(t*qpow(10,l[b[j]])+to[b[j]])%mod; len+=l[b[j]]; len%=(mod-1); } l[a[i]]=len;to[a[i]]=t; } ll ans=0,len=strlen(ch+1); for(int i=1;i<=len;i++)ans=(ans*qpow(10,l[ch[i]-'0'])+to[ch[i]-'0'])%mod; printf("%I64d",ans); return 0; } |
Subscribe