【JZOJ 3082】サイコロゲーム

4326 ワード

Description
まず、この有名なサイコロゲームを紹介しましょう.次に、このゲームの地図を紹介します.R*Cのグリッド図です.サイコロの最初の状態は、上図のように(上は1、下は6、左は4、右は3、前は2、後ろは5)、左上隅にあります.そしてメインイベントが来ました.必要な操作はサイコロを転がすことです.サイコロを転がすのはもちろん軌跡がある.左から右にスクロールして右端にスクロールし、下にスクロールして左にスクロールし、下にスクロールして、最下行まで繰り返します.ゲームの目的は、サイコロが各グリッドに到達したときのサイコロの上の数字の和を計算することです.
Solution
各行が直接スキップでき、各行が直接スキップできるのは明らかで、複雑度:O(n)or O(1)PS:出題者はなぜ1018に出ないのか.
Code
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long LL;
int m,n;
LL ans; 
int a[7]={0,1,3,6,4,2,5};
void gun(int e)
{
    if(e)
    {
        int t=a[3];
        a[3]=a[2],a[2]=a[1],a[1]=a[4],a[4]=t;
    }else 
    {
        int t=a[3];
        a[3]=a[4],a[4]=a[1],a[1]=a[2],a[2]=t;
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    m--;
    fo(i,1,n)
    {
        ans+=a[1]+(21-a[5]-a[6])*(m/4);
        fo(j,1,m%4)gun(i%2),ans+=a[1];
        int t=a[3];
        a[3]=a[5],a[5]=a[1],a[1]=a[6],a[6]=t;
    }
    printf("%lld
"
,ans); return 0; }