The German Collegiate Programming Contest 2017
B - Building
给一个m各面的多边形柱体,每一侧面有n*n个格子,现在对这些格子染色,看有多少种方式使得多面柱体无论如何旋转都不会与另一个一样。
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define mod 1000000007 ll n,m,c; ll quickly_pow(ll x,ll y){ ll ans=1; while(y){ if(y&1) ans=ans*x%mod; y>>=1; x=x*x%mod; } return ans%mod; } int main(){ scanf("%lld%lld%lld",&n,&m,&c); ll pos=quickly_pow(c,n*n); ll ans=0; for(ll i=1;i<=m;i++){ ans+=quickly_pow(pos,__gcd(i,m)); ans%=mod; } printf("%lld ",ans*quickly_pow(m,mod-2)%mod); return 0; }
C - Joyride
有m条边n个点,经过每个点耗时t,花费p,经过每一条边花费ti,现在问你总共时间x,确保花完,在回到出口,花费最小。
bfs+剪枝
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define INF 0x3f3f3f3f vector<int>v[1006]; vector<pair<int,int> >cost(1005); struct node{ int u,t,w; node(int u,int t,int w):u(u),t(t),w(w){} bool operator<(const node &a) const{ return w>a.w; } }; int x,n,m,t; int dis[1006][1006]; void bfs(){ memset(dis,INF,sizeof(dis)); if(x-cost[1].first<0) return ; priority_queue<node>q; dis[1][x-cost[1].first]=cost[1].second; q.push(node(1,x-cost[1].first,cost[1].second)); while(!q.empty()){ node e=q.top(); q.pop(); if(e.w>dis[e.u][e.t]) continue; if(e.t-cost[e.u].first>=0){ if(dis[e.u][e.t-cost[e.u].first]>(dis[e.u][e.t]+cost[e.u].second)){ dis[e.u][e.t-cost[e.u].first]=dis[e.u][e.t]+cost[e.u].second; q.push(node(e.u,e.t-cost[e.u].first,dis[e.u][e.t-cost[e.u].first])); } } for(int i=0;i<v[e.u].size();i++){ if(e.t-t-cost[v[e.u][i]].first>=0){ if(dis[v[e.u][i]][e.t-cost[v[e.u][i]].first-t]>(dis[e.u][e.t]+cost[v[e.u][i]].second)){ dis[v[e.u][i]][e.t-cost[v[e.u][i]].first-t]=dis[e.u][e.t]+cost[v[e.u][i]].second; q.push(node(v[e.u][i],e.t-cost[v[e.u][i]].first-t,dis[v[e.u][i]][e.t-cost[v[e.u][i]].first-t])); } } } } } int main(){ scanf("%d%d%d%d",&x,&n,&m,&t); for(int i=0;i<m;i++){ int u,to; scanf("%d%d",&u,&to); v[u].push_back(to); v[to].push_back(u); } for(int i=1;i<=n;i++) scanf("%d%d",&cost[i].first,&cost[i].second); bfs(); if(dis[1][0]==INF) printf("It is a trap. "); else printf("%d ",dis[1][0]); return 0; }