結果
| 問題 | No.122 傾向と対策:門松列(その3) | 
| コンテスト | |
| ユーザー |  yaoshimax | 
| 提出日時 | 2015-03-30 22:27:50 | 
| 言語 | PyPy2 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 258 ms / 5,000 ms | 
| コード長 | 2,137 bytes | 
| コンパイル時間 | 361 ms | 
| コンパイル使用メモリ | 77,084 KB | 
| 実行使用メモリ | 92,288 KB | 
| 最終ジャッジ日時 | 2024-07-03 22:57:52 | 
| 合計ジャッジ時間 | 3,345 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 8 | 
ソースコード
border=[map(int,raw_input().split()) for i in range(7)]
dp4up= [[0 for i in range(1<<4)]for j in range(20002)]
dp4down= [[0 for i in range(1<<4)]for j in range(20002)]
dp3up= [[0 for i in range(1<<3)]for j in range(20002)]
dp3down= [[0 for i in range(1<<3)]for j in range(20002)]
dp4up[0][0]=1
dp3up[0][0]=1
dp4down[20001][0]=1
dp3down[20001][0]=1
mod=1000000007
for i in range(0,20001):
    for mask in range(1<<4):
        dp4up[i+1][mask]+=dp4up[i][mask]
        for j in range(4):
            if (mask&(1<<j)) ==0 :
                if border[j*2][0]<=i and i<= border[j*2][1]:
                    dp4up[i+1][mask+(1<<j)]+=dp4up[i][mask]
                    dp4up[i+1][mask+(1<<j)]%=mod
    for mask in range(1<<3):
        dp3up[i+1][mask]+=dp3up[i][mask]
        for j in range(3):
            if (mask&(1<<j)) ==0 :
                if border[j*2+1][0]<=i and i<= border[j*2+1][1]:
                    dp3up[i+1][mask+(1<<j)]+=dp3up[i][mask]
                    dp3up[i+1][mask+(1<<j)]%=mod
for i in range(20001,0,-1):
    for mask in range(1<<4):
        dp4down[i-1][mask]+=dp4down[i][mask]
        for j in range(4):
            if( (mask&(1<<j)) ==0 ):
                if border[j*2][0]<=i and i<= border[j*2][1]:
                    dp4down[i-1][mask+(1<<j)]+=dp4down[i][mask]
                    dp4down[i-1][mask+(1<<j)]%=mod
    for mask in range(1<<3):
        dp3down[i-1][mask]+=dp3down[i][mask]
        for j in range(3):
            if( (mask&(1<<j)) ==0 ):
                if border[j*2+1][0]<=i and i<= border[j*2+1][1]:
                    dp3down[i-1][mask+(1<<j)]+=dp3down[i][mask]
                    dp3down[i-1][mask+(1<<j)]%=mod
#for i in range(0,8):
#    print i,"up"
#    for j in range(1<<4):
#        print format(j,'b'),":",dp4up[i][j], ",",
#    print 
#for i in range(0,8):
#    print i,"donw "
#    for j in range(1<<4):
#        print format(j,'b'),":",dp4down[i][j], ",",
#    print 
ans=0
for i in range(20001):
    ans += (dp3up[i+1][(1<<3)-1]-dp3up[i][(1<<3)-1])*dp4down[i][(1<<4)-1]
    ans%=mod
    ans += (dp4up[i+1][(1<<4)-1]-dp4up[i][(1<<4)-1])*dp3down[i][(1<<3)-1]
    ans%=mod
print ans
            
            
            
        