日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

topcoder srm 495 div1

發布時間:2025/7/14 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 topcoder srm 495 div1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

problem1 link

從前向后確定一下,然后再從后向前確定一下。一樣的話就是可以確定的。

problem2 link

首先將強連通分量縮點。理論上來說,只需要遍歷所有入度為0的聯通塊中的一個即可。

但是有一種情況可能是某個入度為0的聯通塊只包含一個節點$u$,這時當遍歷完其他入度為0的聯通塊時即可確定節點$u$。

problem3 link

當$N$不能整除$H$時無解。

設連續的電梯長度為$L$。那么兩個相鄰的連續電梯塊之間的長度也一定是$L$的倍數。

設$f(H,N)$表示$L>1$的答案,$g(H,N)$表示$L=1$的答案,那么題目的答案為$f(H,N)+g(H,N)$

其中$f(H,N)=\sum_{L|N,L>1}g(\frac{H}{L},\frac{N}{L})$

那么剩下的問題是如何計算$g(H,N)$。首先當$N=1$時,$g(H,N)=1$。

否則,設$N$節電梯當=的位置分別為$a_{0},a_{1},...,a_{N-1}$,其中$a_{0}=0$。電梯一共要停$\frac{H}{N}$次。設第$i$次停的時候最下面一節電梯所停的樓層為$b_{i}$。顯然$b_{0}=0$

第一次停的樓層為 $a_{0}+b_{0},a_{1}+b_{0},...,a_{N-1}+b_{0}$

第二次停的樓層為 $a_{0}+b_{1},a_{1}+b_{1},...,a_{N-1}+b_{1}$

那么很顯然$a_{0}+b_{1}=1$,因為$a_{1}+b_{0}=a_{1}\ne 1$

所以$b_{1}=1$

對于某一層樓$x$,一定存在唯一的二元組$(i,j)$滿足$x=a_{i}+b_{j}$

交換數組$a,b$,可以看作現在是$\frac{H}{N}$節電梯,停$N$次。因此

$g(H,N)=\left\{\begin{matrix}1 & N=1\\? f(H,\frac{H}{N}) & N > 1\end{matrix}\right.$

?

code for problem1

public class ColorfulCards {public int[] theCards(int N, String colors) {boolean[] p = new boolean[N + 1];for (int i = 1; i <= N; ++ i) {p[i] = isprime(i);}final int x = colors.length();int[] f = new int[x];for (int id = 1, i = 0; i < x; ++ i) {while (id <= N && !match(colors.charAt(i), p[id])) {++ id;}if (id > N) {f[i] = -1;}else {f[i] = id ++;}}for (int id = N, i = x - 1; i >= 0; -- i) {while (id > 1 && !match(colors.charAt(i), p[id])) {-- id;}if (id < 1) {f[i] = -1;}else {if (f[i] != id) {f[i] = -1;}-- id;}}return f;}static boolean match(char c, boolean b) {return c == 'R' && b || c == 'B' && !b;}static boolean isprime(int x) {if (x == 1) {return false;}for (int i = 2; i * i <= x; ++ i) {if (x % i == 0) {return false;}}return true;} }

  

code for problem2

import java.util.*; import java.math.*; import static java.lang.Math.*;public class CarrotBoxes {public double theProbability(String[] information) {final int n = information.length;boolean[][] g = new boolean[n][n];for (int i = 0; i < n; ++ i) {for (int j = 0; j < n; ++ j) {g[i][j] = (information[i].charAt(j) == 'Y');}}for (int i = 0; i < n; ++ i) {for (int j = 0; j < n; ++ j) {for (int k = 0; k < n; ++ k) {if (g[j][i] && g[i][k]) {g[j][k] = true;}}}}List<Integer> top = new ArrayList<>();boolean[] tag = new boolean[n];for (int i = 0; i < n; ++ i) {if (tag[i]) {continue;}int ind = 0;for (int j = 0; j < n; ++ j) {if (g[j][i] && g[i][j]) {tag[j] = true;continue;}if (g[j][i]) {++ ind;break;}}if (0 == ind) {top.add(i);}}final long all = (1l << n) - 1;for (int i = 0; i < top.size(); ++ i) {final int last = top.get(i);long st = 0;for (int j = 0; j < top.size(); ++ j) {if (j == i) {continue;}final int t = top.get(j);for (int k = 0; k < n; ++ k) {if (k != last && g[t][k]) {st |= 1l << k;}}}if (st == (all ^ (1l << last))) {return 1.0 * (n - (top.size() - 1)) / n;}}return 1.0 * (n - top.size()) / n;} }

  

code for problem3

import java.util.*; import java.math.*; import static java.lang.Math.*;public class StrangeElevator {final static long B = 1000000001;final static int mod = 1000000007;Map<Long, Integer> Gmap = new HashMap<>();Map<Long, Integer> Fmap = new HashMap<>();public int theCount(int H, int N) {if (H % N != 0) {return 0;}return (F(H, N) + G(H, N)) % mod;}int G(int H, int N) {if (N == 1) {return 1;}if (Gmap.containsKey(H * B + N)) {return Gmap.get(H * B + N);}int result = F(H, H / N);Gmap.put(H * B + N, result);return result;}int F(int H, int N) {if (Fmap.containsKey(H * B + N)) {return Fmap.get(H * B + N);}int result = 0;for (int i = 1; i * i <= N; ++ i) {if (N % i == 0) {if (i > 1) {result += G(H / i, N / i);result %= mod;}if (i *i != N) {result += G(H / (N / i), i);result %= mod;}}}Fmap.put(H * B + N, result);return result;} }

  

總結

以上是生活随笔為你收集整理的topcoder srm 495 div1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。