1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include<bits/stdc++.h> using namespace std; int n,m,t,jc[11],ans=0; char ch; int x[15],y[15]; map<vector<int>,int> mp; int cnt[15],xvis[15],yvis[15]; void init(int now,int tot) { if(now==0) { vector<int> v; for(int i=1;i<=tot;i++) v.push_back(cnt[i]); sort(v.begin(),v.end()); mp[v]++; return; } for(int i=1;i<=tot+1;i++) { if(xvis[x[now]]&(1<<i)) continue; if(yvis[y[now]]&(1<<i)) continue; cnt[i]++; xvis[x[now]]^=(1<<i),yvis[y[now]]^=(1<<i); init(now-1,max(tot,i)); cnt[i]--; xvis[x[now]]^=(1<<i),yvis[y[now]]^=(1<<i); } } void dfs1(int now,int sum,int bd) { if(now==0) { if(sum!=0) return; vector<int> v; for(int i=1;i<=n;i++) if(cnt[i]) v.push_back(cnt[i]); sort(v.begin(),v.end()); int res=mp[v],lst=0; for(int i=1;i<v.size();i++) if(v[i]!=v[i-1]) res*=jc[i-lst],lst=i; res*=jc[v.size()-lst]; ans+=res; return; } if(sum>now*n||sum<now) return; for(int i=bd;i<=n;i++) { cnt[i]++; dfs1(now-1,sum-i,i); cnt[i]--; } } void dfs2(int now,int sum,int bd) { if(now==0) { if(sum!=1) return; vector<int> v; for(int i=1;i<=n;i++) if(cnt[i]) v.push_back(cnt[i]); sort(v.begin(),v.end()); int res=mp[v],lst=0; for(int i=1;i<v.size();i++) if(v[i]!=v[i-1]) res*=jc[i-lst],lst=i; res*=jc[v.size()-lst]; ans+=res; return; } for(int i=bd;i<=n;i++) { if(sum%i!=0) continue; cnt[i]++; dfs2(now-1,sum/i,i); cnt[i]--; } } signed main() { jc[0]=1; for(int i=1;i<=10;i++) jc[i]=jc[i-1]*i; cin>>n>>m>>t>>ch; for(int i=1;i<=m;i++) cin>>x[i]>>y[i]; if(ch=='-') { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j&&(i-j==t||j-i==t)) ans++; cout<<ans<<endl; return 0; } if(ch=='/') { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j&&(j*t==i||i*t==j)) ans++; cout<<ans<<endl; return 0; } init(m,0); if(ch=='+') dfs1(m,t,1); else dfs2(m,t,1); cout<<ans<<endl; return 0; }
|