# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
339630 | 2020-12-25T18:33:48 Z | Ahmad_Hasan | 아름다운 순열 (IZhO12_beauty) | C++17 | 1 ms | 364 KB |
#include <bits/stdc++.h> using namespace std; int n; int nums[25]; int cnt=0; vector<vector<int> > dp; int slv(int msk=0,int lstidx=-1){ if(msk==(1<<n)-1){ return 1; } int cnt=0; if(lstidx!=-1&&dp[msk][lstidx]!=-1) return dp[msk][lstidx]; for(int i=0;i<n;i++){ if(!(msk&(1<<i))){ if(lstidx==-1){ cnt+=slv(msk|(1<<i),i); continue; } int f=0; { int num1=nums[lstidx]; int num2=nums[i]; int cntb2=0; while(num1||num2){ cntb2-=num1%2; cntb2+=num2%2; num1/=2; num2/=2; } if(!cntb2){ f=1; } num1=nums[lstidx]; num2=nums[i]; int cntb3=0; while(num1||num2){ cntb3-=num1%3==1; cntb3+=num2%3==1; num1/=3; num2/=3; } if(!cntb3){ f=1; } } if(f){ cnt+=slv(msk|(1<<i),i); } } } return dp[msk][lstidx]=cnt; } int main() { freopen("b.in","r",stdin); freopen("b.out","w",stdout); cin>>n; for(int i=0;i<n;i++){ cin>>nums[i]; } dp=vector<vector<int> >((1<<n)+5,vector<int>(n+5,-1)); cout<<slv(); return 0; } /**** 1 8 4 3 1 4 3 1 8 8 7 1 100 9 1 100 2 1 3 2 4 3 5 4 100 99 99 98 98 97 97 96 19 3 6 3 12 9 2000000000 1000000000 1000000000 3 1000000000 1000000000 */
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 1 ms | 364 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |