A. The beautiful values of the palace
待补
B. super_log
题意:研究一下就是求幂塔函数 %m的值。
思路:扩展欧拉降幂。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const long long mod = 1e9 + 7; 5 int a, b, m; 6 ll eular(ll n) 7 { 8 ll ans = n; 9 for(int i = 2;i * i <= n;i++) 10 { 11 if(n % i == 0) 12 { 13 ans -= ans / i; 14 while(n % i == 0) n /= i; 15 } 16 } 17 if(n != 1) ans -= ans / n; 18 return ans; 19 } 20 int ksm(ll a, ll n, ll mod) 21 { 22 if(n == 0) return 1; 23 if(a <= 1) return a; 24 if (n == 0) 25 return 1; 26 if (a<=1) 27 return a; 28 bool flag = false; 29 ll t = 1; 30 for (int i = 0; i < n; i++) 31 { 32 t = t*a; 33 if (t >= mod) 34 { 35 flag = true; 36 break; 37 } 38 } 39 ll ans = 1; 40 while (n) 41 { 42 if (n & 1) 43 { 44 ans *= a; 45 ans %= mod; 46 } 47 a = a * a % mod; 48 n >>= 1; 49 } 50 if (flag) 51 { 52 ans += mod; 53 } 54 return ans; 55 } 56 ll dfs(int a,int b,ll mod) 57 { 58 if (b == 0) 59 return 1; 60 if (b == 1) 61 return a; 62 if (mod == 1) 63 return 1; 64 ll h1 = ksm(a, dfs(a, b-1, eular(mod)),mod); 65 return h1; 66 } 67 int main() 68 { 69 int t; 70 cin >>t; 71 while(t--) 72 { 73 cin >> a >> b >> m; 74 cout << dfs(a, b, m) % m << endl; 75 } 76 return 0; 77 }
D. Robots
待补
F. Greedy Sequence
题意:题意好绕的啊,自己看吧。
思路:用线段树查询区间最大值,因为对于每个数 i,只有比他小的数才有用,所以从小到大枚举,在线段树中(此时所有值都小于 i )。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define lson l , m , rt << 1 4 #define rson m + 1, r, rt << 1 | 1 5 #define ls rt << 1 6 #define rs rt << 1 | 1 7 #define lr2 (l + r) / 2 8 const int maxn = 1e5+ 50; 9 int n, k, a[maxn], pos[maxn]; 10 int ans[maxn]; 11 int sum[maxn* 4] ; 12 void up(int rt){ 13 sum[rt] = max(sum[ls], sum[rs]); 14 } 15 void build(int l ,int r, int rt) 16 { 17 sum[rt] = 0; 18 if(l == r) return ; 19 int m = lr2; 20 build(lson); 21 build(rson); 22 up(rt); 23 } 24 int query(int a, int b, int l, int r, int rt) 25 { 26 if(a <= l && b >= r) return sum[rt]; 27 int ans = 0; 28 int m = lr2; 29 if(a <= m) ans = max(ans,query(a, b, lson)); 30 if(b > m) ans = max(ans, query(a, b, rson)); 31 return ans; 32 } 33 void update(int k, int v, int l, int r, int rt) 34 { 35 if(l == r){ 36 sum[rt] = v; 37 return; 38 } 39 int m = lr2; 40 if(k <= m) update(k, v, lson); 41 else update(k, v, rson); 42 up(rt); 43 } 44 int main() 45 { 46 std::ios::sync_with_stdio(false); 47 int t; 48 cin >> t; 49 while(t--) 50 { 51 cin >> n >> k; 52 for(int i = 1;i <= n;i++){ 53 cin >> a[i]; 54 pos[a[i]] = i; 55 } 56 build(1, n, 1); 57 for(int i = 1;i <= n;i++) 58 { 59 int l = max(1, pos[i] - k); 60 int r = min(n, pos[i] + k); 61 int x = query(l, r , 1, n, 1); 62 update(pos[i], i, 1, n, 1); 63 ans[i] = ans[x] + 1; 64 } 65 for(int i = 1;i <= n;i++){ 66 cout << ans[i]; 67 if(i == n)cout << endl; 68 else cout << " "; 69 } 70 } 71 return 0; 72 }
H. Holy Grail
题意:给你一张n点m边的有向图,无重边,无负加权循环。请你加6对顶点,请你加6条权值最小的边使之没有负圈。
思路:每给一对顶点,跑一遍最短路,没有负环的条件是没有一条来的路和加的边加起来为负,所以每次加的边和答案为反向最短路。
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<vector> 4 #include<queue> 5 #include<cstring> 6 #include<algorithm> 7 using namespace std; 8 const int maxn = 1e5+5; 9 const int INF = 0x3f3f3f3f; 10 typedef long long ll; 11 typedef pair<ll,int> P; 12 int n,m; 13 struct edge{ 14 int to; 15 ll cost; 16 }es[maxn]; 17 vector <edge> G[maxn]; 18 ll d[maxn]; 19 void dijkstra(int s) 20 { 21 priority_queue<P,vector<P>,greater<P> > que; 22 fill(d,d+m+1,INF); 23 d[s] = 0; 24 que.push(P(0,s)); 25 while(!que.empty()) 26 { 27 P p= que.top();que.pop(); 28 int v = p.second; 29 if(d[v] < p.first) continue; 30 for(int i = 0;i < G[v].size();i++) 31 { 32 edge e = G[v][i];; 33 if(d[e.to] > d[v] + e.cost) 34 { 35 36 d[e.to]= d[v] + e.cost; 37 que.push(P(d[e.to],e.to)); 38 } 39 } 40 } 41 } 42 int main() 43 { 44 std::ios::sync_with_stdio(false); 45 std::cin.tie(0);std::cout.tie(0); 46 int t; 47 cin >> t; 48 while(t--) 49 { 50 cin >> n >> m; 51 for(int i = 0;i <= n;i++)G[i].clear(); 52 int count = 0; 53 int a,b,c; 54 for(int i = 0;i < m;i++) 55 { 56 cin >> a >> b >> c; 57 es[count].to = b; 58 es[count].cost = c; 59 G[a].push_back(es[count++]); 60 } 61 for(int i = 0;i < 6;i++){ 62 cin >> a >> b; 63 dijkstra(b); 64 cout << -d[a] << endl; 65 es[count].to = b; 66 es[count].cost = -d[a]; 67 G[a].push_back(es[count++]); 68 } 69 70 } 71 72 return 0; 73 }