URAL-1979 Resources Distribution

来源:互联网 发布:edu域名申请 编辑:程序博客网 时间:2024/06/16 20:15
一个正方体每个面分为n*n个小方块,每个小方块填上1~6*n*n的数字,要求所有方块数字不一样且绕一圈数字和相同。

容易知道所有的绕圈方式一共有3*n种,而这些绕圈方式每个方块一共会被遍历两次,所以可以计算                                      (1+6*n*n)*6*n*n/2(所有数字和)*2=3*n*S(S为一圈的数字和)

         得S=2*n*(1+6*n*n)。

我们可以考虑一个方块和其对面的方块,他们两个在绕圈计算的时候都会被计算上,所以我们只要让对面的两个方块的和为定值即可,这个定值X满足

         S*2=X*4*n可推出X=1+6*n*n

这样就可以构造出来一种满足题设的情况了,直接遍历一遍打印即可

#include<iostream>#include<cstdio>#include<cstring>#include<ctime>#include<algorithm>#include<cstdlib>#include<cmath>#include<set>#include<bitset>#include<map>#include<stack>#include<queue>#include<vector>#include<utility>#define INF 0x3f3f3f3f#define inf 2*0x3f3f3f3f#define llinf 1000000000000000000#define pi acos(-1.0)#define mod 1000000007#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define lrt rt<<1#define rrt rt<<1|1#define rep(i,a,b) for(int i=(a);i<(b);i++)#define per(i,a,b) for(int i=(b)-1;i>=(a);i--)#define mem(a,b) memset(a,b,sizeof(a))#define lb(x) (x&-x)#define gi(x) scanf("%d",&x)#define gi2(x,y) scanf("%d%d",&x,&y)#define gll(x) scanf("%lld",&x)#define gll2(x,y) scanf("%lld%lld",&x,&y)#define gc(x) scanf("%c",&x)#define gc2(x,y) scanf("%c%c",&x,&y)using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<int,int>P;/***********************************************/int  n;int main(){    cin>>n;    rep(i,0,n)    {        rep(j,0,n)        {            printf("%d ",i*n+j+1);        }        printf("\n");    }    rep(i,0,n)    {        rep(j,0,2*n)        {            printf("%d ",n*n+2*n*i+j+1);        }        rep(j,0,n)        {            printf("%d ",5*n*n-(2*i+1)*n+j+1);        }        rep(j,0,n)        {            printf("%d ",5*n*n-(2*i+2)*n+j+1);        }        printf("\n");    }    rep(i,0,n)    {        rep(j,0,n)        {            printf("%d ",5*n*n+(i+1)*n-j);        }        printf("\n");    }    return 0;}