Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import std.stdio;
- import std.algorithm;
- import std.range;
- import std.bigint;
- import std.conv;
- import std.file;
- import std.string;
- //import std.cstream;
- BigInt[61][61] fig,seqt,seq,mov;
- BigInt[62][61] cf,cm;
- void main() {
- /*version (ONLINE_JUDGE) {
- freopen("catalonian.in","r",din.file);
- freopen("catalonian.out","w",dout.file);
- }*/
- /*
- ios::sync_with_stdio(0);
- cin.tie(0);
- */
- fig[1][0]=1;for (int i=1;i<=61;i++) cf[1][i]=1;
- seqt[0][0]=1;seqt[1][1]=1;
- seq[1][1]=1;for (int i=2;i<=61;i++) cm[1][i]=1;
- for (int i=2;i<=60;i++) {
- for (int j=1;j<=60;j++) {
- BigInt ncr=1;
- for (int k=1;k*j<=i;k++){
- ncr=ncr*(cm[j][j+1]+k-1)/k; // cm[j][j+1] is number of movements with j steps
- fig[i][j]+=cf[i-k*j][j]*ncr;
- }
- cf[i][j+1]=cf[i][j]+fig[i][j];
- }
- for (int j=1;j<=i;j++) for (int k=1;k<=i;k++)
- seqt[i][j]+=seqt[i-k][j-1]*cf[k][k]; //number of figures with k steps
- for (int j=1;j<=i;j++) {
- seq[i][j]=seqt[i][j];
- for (int k=1;k<j;k++) if (j%k==0 && i%(j/k)==0) seq[i][j]-=seq[i/(j/k)][k];
- }
- for (int j=1;j<=60;j++) {
- for (int k=1;k<=j;k++) if (j%k==0 && i%(j/k)==0)
- mov[i][j]+=seq[i/(j/k)][k]/k;
- cm[i][j+1]=cm[i][j]+mov[i][j];
- }
- }
- /*File mk = File("abstract.in", "w");
- mk.writeln("1\n2\n3\n4\n5\n0");
- mk.close();*/
- File inp = File("abstract.in", "r");
- File oup = File("abstract.out", "w");
- int cas=1,n;
- while (1) {
- n=to!int(chomp(inp.readln()));
- if (n==0) break;
- oup.writefln("Case %d: %s",cas++,cm[n][n+1]);
- }
- oup.close();
- /*File ans = File("abstract.out","r");
- while (!ans.eof()) {
- writeln(chomp(ans.readln()));
- }*/
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement