#include<bits/stdc++.h> using namespace std; #define int long long inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } int func(int x) { while(x>9) { int c=1; while(x) c*=(x%10),x/=10; x=c; } return x; } int qwq(int x,int y){ if(x%3==0) return x/3+(y+1)/2; else if(x%3==1) return x/3+(y+2)/2; else return x/3+1+(y+1)/2;} int f[19][55][37][19][19],a[1003],ans[1003][10],w[19],tot; const int da[]={0,0,1,0,2,0,1,0,3,0}; const int db[]={0,0,0,1,0,0,1,0,0,2}; int dfs(int p,int o,int a,int b,int c,int d) { if(a<0||b<0||c<0||d<0) return 0; if(p==-1) return a+b+c+d==0; if(o==0) { if(f[p][a][b][c][d]!=-1) return f[p][a][b][c][d]; int ans=0; for(int i=1; i<=9; ++i) ans+=dfs(p-1,o,a-da[i],b-db[i],c-(i==5),d-(i==7)); return f[p][a][b][c][d]=ans; } else { int ans=0; for(int i=1; i<=w[p]; ++i) ans+=dfs(p-1,(w[p]==i),a-da[i],b-db[i],c-(i==5),d-(i==7)); return ans; } } void clear(int a,int b,int c,int d) { for(int _=0; _<18; ++_) for(int i=0; i<=a; ++i) for(int j=0; j<=b; ++j) for(int k=0; k<=c; ++k) for(int l=0; l<=d; ++l) f[_][i][j][k][l]=-1; } signed main() { int m=1e18,n=read(); for(int i=1; i<=n; ++i) { a[i]=read(),ans[i][0]=a[i],a[i]-=(a[i]==m); for(int j=1; j<=a[i]; j=j*10+1) ++ans[i][1]; } for(int i=1,ci=0; i<=m; i<<=1,++ci) for(int j=i,cj=0; j<=m; j*=3,++cj) for(int k=j,ck=0,K=qwq(ci,cj); k<=m&&K<=18; k*=5,++K,++ck) for(int l=k,cl=0,L=K; l<=m&&L<=18; l*=7,++L,++cl) if(l>1) { int p=func(l); if(!p) continue; // printf("target %lld\n",l); assert(ci+cj+ck+cl); tot=ci+cj+ck+cl, clear(ci,cj,ck,cl); for(int x=1; x<=n; ++x) { for(int y=0,z=a[x]; y<18; ++y,z/=10) w[y]=z%10; for(int u=17,k=1; u>=0; k&=(w[u]==0),--u) ans[x][p]+=dfs(u,k,ci,cj,ck,cl); } } for(int i=1; i<=n; ++i) { for(int j=1; j<=9; ++j) ans[i][0]-=ans[i][j]; for(int j=0; j<=9; ++j) printf("%lld ",ans[i][j]); puts(""); } return 0; }
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #include<bits/stdc++.h> using namespace std; #define int long long inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } int func(int x) { while(x>9) { int c=1; while(x) c*=(x%10),x/=10; x=c; } return x; } int qwq(int x,int y){ if(x%3==0) return x/3+(y+1)/2; else if(x%3==1) return x/3+(y+2)/2; else return x/3+1+(y+1)/2;} int f[19][55][37][19][19],a[1003],ans[1003][10],w[19],tot; const int da[]={0,0,1,0,2,0,1,0,3,0}; const int db[]={0,0,0,1,0,0,1,0,0,2}; int dfs(int p,int o,int a,int b,int c,int d) { if(a<0||b<0||c<0||d<0) return 0; if(p==-1) return a+b+c+d==0; if(o==0) { if(f[p][a][b][c][d]!=-1) return f[p][a][b][c][d]; int ans=0; for(int i=1; i<=9; ++i) ans+=dfs(p-1,o,a-da[i],b-db[i],c-(i==5),d-(i==7)); return f[p][a][b][c][d]=ans; } else { int ans=0; for(int i=1; i<=w[p]; ++i) ans+=dfs(p-1,(w[p]==i),a-da[i],b-db[i],c-(i==5),d-(i==7)); return ans; } } void clear(int a,int b,int c,int d) { for(int _=0; _<18; ++_) for(int i=0; i<=a; ++i) for(int j=0; j<=b; ++j) for(int k=0; k<=c; ++k) for(int l=0; l<=d; ++l) f[_][i][j][k][l]=-1; } signed main() { int m=1e18,n=read(); for(int i=1; i<=n; ++i) { a[i]=read(),ans[i][0]=a[i],a[i]-=(a[i]==m); for(int j=1; j<=a[i]; j=j*10+1) ++ans[i][1]; } for(int i=1,ci=0; i<=m; i<<=1,++ci) for(int j=i,cj=0; j<=m; j*=3,++cj) for(int k=j,ck=0,K=qwq(ci,cj); k<=m&&K<=18; k*=5,++K,++ck) for(int l=k,cl=0,L=K; l<=m&&L<=18; l*=7,++L,++cl) if(l>1) { int p=func(l); if(!p) continue; // printf("target %lld\n",l); assert(ci+cj+ck+cl); tot=ci+cj+ck+cl, clear(ci,cj,ck,cl); for(int x=1; x<=n; ++x) { for(int y=0,z=a[x]; y<18; ++y,z/=10) w[y]=z%10; for(int u=17,k=1; u>=0; k&=(w[u]==0),--u) ans[x][p]+=dfs(u,k,ci,cj,ck,cl); } } for(int i=1; i<=n; ++i) { for(int j=1; j<=9; ++j) ans[i][0]-=ans[i][j]; for(int j=0; j<=9; ++j) printf("%lld ",ans[i][j]); puts(""); } return 0; } |