#include <bits/stdc++.h>
using namespace std;
int ans,g[6],u[8888888][6],st[8888888],lim=0;
#define S 73
void dfs(int d,int uu,int su=0)
{
if(!d)
{
if(su!=lim) return;
++ans; st[ans]=su;
memcpy(u[ans],g,sizeof g);
return;
}
for(int x=uu;su+x<=lim;++x)
g[d-1]=x,dfs(d-1,x,su+x);
}
int p_[100000],*p=p_+50000;
bool chk(int*t)
{
return t[1]==1&&t[2]==2&&t[3]==3&&t[4]==4&&t[5]==5&&t[6]==6&&t[7]==7&&t[8]==8;
}
bool ok[S][S];
int main()
{
for(int mi=0;mi<S;++mi)
for(int mx=mi;mx<S;++mx)
{
for(int d=max(max(mi/2,mx/8),2);mi>=d&&mx>=8*d;++d)
if(mi/d==1&&mx/d==8) ok[mi][mx]=1;
if(mx-mi==7) ok[mi][mx]=1;
for(int d=max(mx,mi*8);d<2*mx&&d<9*mi;++d)
if(d/mx==1&&d/mi==8) ok[mi][mx]=1;
if(mi<1&&mx==8) ok[mi][mx]=1;
if(mi==1&&mx>8) ok[mi][mx]=1;
}
for(lim=0;lim<=S;++lim)
dfs(6,0);
cout<<ans<<" different dices\n";
long long pa=0,pb=0;
for(int i=1;i<=ans&&st[i]+st[i]<=S;++i)
{
for(int j=i;j<=ans;++j)
{
if(st[i]+st[j]>S) break;
++pa;
int mi=u[i][5]+u[j][5];
int mx=u[i][0]+u[j][0];
if(!ok[mi][mx]) continue;
++pb;
#define FOUND_SOL(l,ex) \
{int tot=0;for(auto a:u[i]) tot+=a;for(auto b:u[j]) tot+=b;\
cout<<"[";for(auto a=5;a>=0;--a)cout<<u[i][a]<<",";cout<<"\b],";\
cout<<"[";for(auto a=5;a>=0;--a)cout<<u[j][a]<<",";cout<<"\b] DS="<<tot<<" LINE"<<l; ex; cout<<"\n";}
//plus or minus
if(mx-mi==7)
{
memset(p,0,sizeof(int)*10);
for(auto a:u[i])
for(auto b:u[j]) ++p[a+b-mi+1];
if(chk(p)) FOUND_SOL(__LINE__,void(0))
}
//neg minus
if(mx-mi==7)
{
memset(p,0,sizeof(int)*10);
for(auto a:u[i])
for(auto b:u[j]) ++p[mx-(a+b)+1];
if(chk(p)) FOUND_SOL(__LINE__,void(0))
}
//multiply surely cannot make a full covering
//divison
for(int d=max(max(mi/2,mx/8),2);mi>=d&&mx>=8*d;++d)
{
if(mi/d==1&&mx/d==8)
{
++pa;
memset(p,0,sizeof(int)*10);
for(auto a:u[i])
for(auto b:u[j]) ++p[(a+b)/d];
if(chk(p)) FOUND_SOL(__LINE__,cout<<" D="<<d)
}
}
//back division
if(mi&&mx)
for(int d=max(mx,mi*8);d<2*mx&&d<9*mi;++d)
{
if(d/mx==1&&d/mi==8)
{
++pa;
memset(p,0,sizeof(int)*10);
for(auto a:u[i])
for(auto b:u[j]) ++p[d/(a+b)];
if(chk(p)) FOUND_SOL(__LINE__,cout<<" D="<<d)
}
}
//max 1
if(mi<1&&mx==8)
{
memset(p,0,sizeof(int)*10);
for(auto a:u[i])
for(auto b:u[j]) ++p[max(a+b,1)];
if(chk(p)) FOUND_SOL(__LINE__,void(0))
}
//min 8
if(mi==1&&mx>8)
{
memset(p,0,sizeof(int)*10);
for(auto a:u[i])
for(auto b:u[j]) ++p[min(a+b,8)];
if(chk(p)) FOUND_SOL(__LINE__,void(0))
}
}
}
cout<<pa<<" "<<pb<<"\n";
for(;;);
}
//on my computer, runtime ~155s
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmludCBhbnMsZ1s2XSx1Wzg4ODg4ODhdWzZdLHN0Wzg4ODg4ODhdLGxpbT0wOwojZGVmaW5lIFMgNzMKdm9pZCBkZnMoaW50IGQsaW50IHV1LGludCBzdT0wKQp7CglpZighZCkKCXsKCQlpZihzdSE9bGltKSByZXR1cm47CgkJKythbnM7IHN0W2Fuc109c3U7CgkJbWVtY3B5KHVbYW5zXSxnLHNpemVvZiBnKTsKCQlyZXR1cm47Cgl9Cglmb3IoaW50IHg9dXU7c3UreDw9bGltOysreCkKCQlnW2QtMV09eCxkZnMoZC0xLHgsc3UreCk7Cn0KaW50IHBfWzEwMDAwMF0sKnA9cF8rNTAwMDA7CmJvb2wgY2hrKGludCp0KQp7CglyZXR1cm4gdFsxXT09MSYmdFsyXT09MiYmdFszXT09MyYmdFs0XT09NCYmdFs1XT09NSYmdFs2XT09NiYmdFs3XT09NyYmdFs4XT09ODsKfQpib29sIG9rW1NdW1NdOwppbnQgbWFpbigpCnsKCWZvcihpbnQgbWk9MDttaTxTOysrbWkpCgkJZm9yKGludCBteD1taTtteDxTOysrbXgpCgkJewoJCQlmb3IoaW50IGQ9bWF4KG1heChtaS8yLG14LzgpLDIpO21pPj1kJiZteD49OCpkOysrZCkKCQkJCWlmKG1pL2Q9PTEmJm14L2Q9PTgpIG9rW21pXVtteF09MTsKCQkJaWYobXgtbWk9PTcpIG9rW21pXVtteF09MTsKCQkJZm9yKGludCBkPW1heChteCxtaSo4KTtkPDIqbXgmJmQ8OSptaTsrK2QpCgkJCQlpZihkL214PT0xJiZkL21pPT04KSBva1ttaV1bbXhdPTE7CgkJCWlmKG1pPDEmJm14PT04KSBva1ttaV1bbXhdPTE7CgkJCWlmKG1pPT0xJiZteD44KSBva1ttaV1bbXhdPTE7CgkJfQoJZm9yKGxpbT0wO2xpbTw9UzsrK2xpbSkKCQlkZnMoNiwwKTsKCWNvdXQ8PGFuczw8IiBkaWZmZXJlbnQgZGljZXNcbiI7Cglsb25nIGxvbmcgcGE9MCxwYj0wOwoJZm9yKGludCBpPTE7aTw9YW5zJiZzdFtpXStzdFtpXTw9UzsrK2kpCgl7CgkJZm9yKGludCBqPWk7ajw9YW5zOysraikKCQl7CgkJCWlmKHN0W2ldK3N0W2pdPlMpIGJyZWFrOwoJCQkrK3BhOwoJCQlpbnQgbWk9dVtpXVs1XSt1W2pdWzVdOwoJCQlpbnQgbXg9dVtpXVswXSt1W2pdWzBdOwoJCQlpZighb2tbbWldW214XSkgY29udGludWU7CgkJCSsrcGI7CgkJCSNkZWZpbmUgRk9VTkRfU09MKGwsZXgpIFwKCQkJe2ludCB0b3Q9MDtmb3IoYXV0byBhOnVbaV0pIHRvdCs9YTtmb3IoYXV0byBiOnVbal0pIHRvdCs9YjtcCgkJCWNvdXQ8PCJbIjtmb3IoYXV0byBhPTU7YT49MDstLWEpY291dDw8dVtpXVthXTw8IiwiO2NvdXQ8PCJcYl0sIjtcCgkJCWNvdXQ8PCJbIjtmb3IoYXV0byBhPTU7YT49MDstLWEpY291dDw8dVtqXVthXTw8IiwiO2NvdXQ8PCJcYl0gRFM9Ijw8dG90PDwiIExJTkUiPDxsOyBleDsgY291dDw8IlxuIjt9CgkJCS8vcGx1cyBvciBtaW51cwoJCQlpZihteC1taT09NykKCQkJewoJCQkJbWVtc2V0KHAsMCxzaXplb2YoaW50KSoxMCk7CgkJCQlmb3IoYXV0byBhOnVbaV0pCgkJCQkJZm9yKGF1dG8gYjp1W2pdKSArK3BbYStiLW1pKzFdOwoJCQkJaWYoY2hrKHApKSBGT1VORF9TT0woX19MSU5FX18sdm9pZCgwKSkKCQkJfQoJCQkvL25lZyBtaW51cwoJCQlpZihteC1taT09NykKCQkJewoJCQkJbWVtc2V0KHAsMCxzaXplb2YoaW50KSoxMCk7CgkJCQlmb3IoYXV0byBhOnVbaV0pCgkJCQkJZm9yKGF1dG8gYjp1W2pdKSArK3BbbXgtKGErYikrMV07CgkJCQlpZihjaGsocCkpIEZPVU5EX1NPTChfX0xJTkVfXyx2b2lkKDApKQoJCQl9CgkJCS8vbXVsdGlwbHkgc3VyZWx5IGNhbm5vdCBtYWtlIGEgZnVsbCBjb3ZlcmluZwoJCQkvL2Rpdmlzb24KCQkJZm9yKGludCBkPW1heChtYXgobWkvMixteC84KSwyKTttaT49ZCYmbXg+PTgqZDsrK2QpCgkJCXsKCQkJCWlmKG1pL2Q9PTEmJm14L2Q9PTgpCgkJCQl7CgkJCQkJKytwYTsKCQkJCQltZW1zZXQocCwwLHNpemVvZihpbnQpKjEwKTsKCQkJCQlmb3IoYXV0byBhOnVbaV0pCgkJCQkJCWZvcihhdXRvIGI6dVtqXSkgKytwWyhhK2IpL2RdOwoJCQkJCWlmKGNoayhwKSkgRk9VTkRfU09MKF9fTElORV9fLGNvdXQ8PCIgRD0iPDxkKQoJCQkJfQoJCQl9CgkJCS8vYmFjayBkaXZpc2lvbgoJCQlpZihtaSYmbXgpCgkJCWZvcihpbnQgZD1tYXgobXgsbWkqOCk7ZDwyKm14JiZkPDkqbWk7KytkKQoJCQl7CgkJCQlpZihkL214PT0xJiZkL21pPT04KQoJCQkJewoJCQkJCSsrcGE7CgkJCQkJbWVtc2V0KHAsMCxzaXplb2YoaW50KSoxMCk7CgkJCQkJZm9yKGF1dG8gYTp1W2ldKQoJCQkJCQlmb3IoYXV0byBiOnVbal0pICsrcFtkLyhhK2IpXTsKCQkJCQlpZihjaGsocCkpIEZPVU5EX1NPTChfX0xJTkVfXyxjb3V0PDwiIEQ9Ijw8ZCkKCQkJCX0KCQkJfQoJCQkvL21heCAxCgkJCWlmKG1pPDEmJm14PT04KQoJCQl7CgkJCQltZW1zZXQocCwwLHNpemVvZihpbnQpKjEwKTsKCQkJCWZvcihhdXRvIGE6dVtpXSkKCQkJCQlmb3IoYXV0byBiOnVbal0pICsrcFttYXgoYStiLDEpXTsKCQkJCWlmKGNoayhwKSkgRk9VTkRfU09MKF9fTElORV9fLHZvaWQoMCkpCgkJCX0KCQkJLy9taW4gOAoJCQlpZihtaT09MSYmbXg+OCkKCQkJewoJCQkJbWVtc2V0KHAsMCxzaXplb2YoaW50KSoxMCk7CgkJCQlmb3IoYXV0byBhOnVbaV0pCgkJCQkJZm9yKGF1dG8gYjp1W2pdKSArK3BbbWluKGErYiw4KV07CgkJCQlpZihjaGsocCkpIEZPVU5EX1NPTChfX0xJTkVfXyx2b2lkKDApKQoJCQl9CgkJfQoJfQoJY291dDw8cGE8PCIgICI8PHBiPDwiXG4iOwoJZm9yKDs7KTsKfQovL29uIG15IGNvbXB1dGVyLCBydW50aW1lIH4xNTVzCg==