Hi friends,
Is there any explicit way to convert C++ source code to java.
Below is my code in C++, can anyone give me its Java code?
#include <algorithm>
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define x first
#define y second
#define Inf 1000000001
const int Mod = 1000000007;
pii f[11][1024][10][10];
int mul(int x,int y){ return ll(x)*y%Mod; }
void relax(pii&a,const pii&b,int c){
if(b.x+c<a.x)a=pii(b.x+c,b.y);
else if(b.x+c==a.x)a.y=(a.y+b.y)%Mod;
}
void relax(pii&a,const pii&b,const pii&c){
if(b.x+c.x<a.x)a=pii(b.x+c.x,mul(b.y,c.y));
else if(b.x+c.x==a.x)a.y=(a.y+mul(b.y,c.y))%Mod;
}
void Init(){
for(int m=0;m<1<<10;++m)
if(m&1){
for(int d0=0;d0<10;++d0){
pii reach[20];
for(int k=0;k<20;++k)
reach[k]=pii(Inf,0);
reach[d0]=pii(0,1);
for(int k=0;k<10;++k)
for(int use=0;use<10;++use)
if(k+use<20 && (use==k || (m&1<<use)))
relax(reach[k+use],reach[k],1);
for(int d1=0;d1<10;++d1){
f[0][m][d0][d1]=reach[d1];
f[1][m][d0][d1]=reach[10+d1];
}
}
}
for(int n=2;n<=10;++n)
for(int m=0;m<1<<10;++m)if(m&1)
for(int d0=0;d0<10;++d0){
pii t[11][10];
for(int j=0;j<10;++j)
t[0][j]=pii(Inf,0);
t[0][d0]=pii(0,1);
for(int i=0;i<10;++i){
for(int j=0;j<10;++j)
t[i+1][j]=pii(Inf,0);
pii (*f0)[10]=f[n-1]
m;
for(int j=0;j<10;++j)
for(int j1=0;j1<10;++j1)
relax(t[i+1][j1],t[i][j],f0[j][j1]);
}
for(int d1=0;d1<10;++d1)
f[n][m][d0][d1]=t[10][d1];
}
}
string X;
pii F_[10][10][10];
pii S[11][10];
pii Solve(int i,int m,int d0){
if(i+1==X.size())
return f[0][m][d0][X[i]-'0'];
pii&res=S[i][d0];
if(res.x==-1){
res=pii(Inf,0);
if(X
=='0')res=Solve(i+1,m,d0);
else if(X[i]=='1'){
pii(*f0)[10]=f[X.size()-i-1][m];
for(int d=0;d<10;++d)
relax(res,f0[d0][d],Solve(i+1,m|1<<1,d));
}else{
pii(*F)[10]=F_[i];
int n=X.size()-i-1;
pii(*f0)[10]=f[n][m];
for(int d=0;d<10;++d)
F[1][d]=f0[d0][d];
int dig=X[i]-'0';
for(int D=2,M;D<=dig;++D){
f0=f[n][M=m|1<<(D-1)];
for(int D1=0;D1<10;++D1){
F[D][D1]=pii(Inf,0);
for(int D0=0;D0<10;++D0)
relax(F[D][D1],F[D-1][D0],f0[D0][D1]);
}
}
for(int d=0;d<10;++d)
relax(res,F[dig][d],Solve(i+1,m|1<<dig,d));
}
}
return res;
}
void Print(const pii&res){
if(res.x<Inf)
cout<<res.x<<' '<<res.y<<endl;
else puts("IMPOSSIBLE");
}
int main(){
#ifdef LocalHost
freopen("x.in","r",stdin);
freopen("x.out","w",stdout);
#endif
Init();
for(int k;cin>>k;){
if(k<10){
Print(f[0][1][1][k]);
}else{
char tmp[20];
sprintf(tmp,"%d",k);
X=tmp;
for(int i=0;i<11;++i)
for(int j=0;j<10;++j)
S[i][j]=pii(-1,0);
Print(Solve(0,1,1));
}
}
return 0;
}