NC22589. 小D的剧场
描述
——《少女☆歌剧 Revue·Starlight》
题目描述
输入描述
第一行为两个整数 n, q ,表示序列的长度和有多少和弦小D不喜欢.
接下来 q 行,每行三个整数 a, b, c ,表示小D不想出现的和弦
输出描述
一行一个整数,表示答案
示例1
输入:
10 10 18 3 3 43 28 22 42 28 3 48 48 4 29 9 31 47 9 22 1 22 49 15 48 29 2 8 27 4 24 34
输出:
382785822
示例2
输入:
3 1 1 2 3
输出:
117643
说明:
C++14(g++5.4) 解法, 执行用时: 508ms, 内存消耗: 22212K, 提交时间: 2019-02-15 19:20:53
#include<stdio.h> #define fo(i,a,b) for(int i=a;i<=b;i++) int n,q,aa,bb,cc; const int p=1e9+7; bool v[100][100][100]; long long f[1020][100][100],ans; int main(){ scanf("%d%d",&n,&q); while (q--){ scanf("%d%d%d",&aa,&bb,&cc); v[aa][bb][cc]=1; v[aa][cc][bb]=1; v[bb][aa][cc]=1; v[bb][cc][aa]=1; v[cc][aa][bb]=1; v[cc][bb][aa]=1; } fo(a,1,49) fo(b,1,49) f[2][a][b]=1; fo(i,3,n) fo(a,1,49) fo(b,1,49) fo(c,1,49) if (!v[a][b][c]){ f[i][b][c]+=f[i-1][a][b]; if (f[i][b][c]>=p) f[i][b][c]-=p; } fo(a,1,49) fo(b,1,49) ans+=f[n][a][b]; ans%=p; printf("%lld\n",ans); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 402ms, 内存消耗: 12316K, 提交时间: 2020-04-05 20:10:15
#include<bits/stdc++.h> using namespace std; const int mod=1e9+7; long long DP[505][55][55]; bool V[55][55][55]={0}; int main() { int i,j,k,l,n,q; scanf("%d%d",&n,&q); while(q--) { scanf("%d%d%d",&i,&j,&k); V[i][j][k]=V[i][k][j]=V[j][i][k]=V[j][k][i]=V[k][i][j]=V[k][j][i]=1; } for(j=1;j<=49;j++) for(k=1;k<=49;k++)DP[2][j][k]=1; for(i=3;i<=n;i++) for(j=1;j<=49;j++) for(k=1;k<=49;k++) for(l=1;l<=49;l++) if(!V[j][k][l])DP[i][k][l]=(DP[i][k][l]+DP[i-1][j][k])%mod; for(k=0,i=1;i<=49;i++) for(j=1;j<=49;j++)k=(k+DP[n][i][j])%mod; printf("%d\n",k); return 0; }