当前位置:   article > 正文

牛客周赛30

牛客周赛30

思路:先把x, y除以最大公约数变成最小值,然后同时乘以倍数cnt,只记录两个数都在[l,r]间的倍数。

代码:

  1. int gcd(int a,int b){
  2. return b ? gcd(b, a % b) : a;
  3. }
  4. void solve(){
  5. int x, y, l, r;
  6. cin >> x >> y >> l >> r;
  7. int g = gcd(x, y);
  8. x /= g,y /= g;
  9. int ans = 0, cnt = 1;
  10. while(x * cnt < l || y * cnt < l)
  11. cnt ++;
  12. while(x * cnt <= r && y * cnt <= r)
  13. ans ++, cnt++;
  14. cout << ans << endl;
  15. }

思路:从下往上dfs,树形dp;

代码:

  1. int n;
  2. vector<int>e[200010];
  3. int f[200010][2];//0 1分别代表红,不染红
  4. void dfs(int u,int fa){
  5. int m1 = 1, m2 = 1;
  6. for(auto v:e[u]){
  7. if(v == fa)continue;
  8. dfs(v, u);
  9. m1 = (m1 * (f[v][0])) % mod; //u节点不染红的话,就需要每个子节点都染红
  10. m2 = (m2 * (f[v][0] + f[v][1]))%mod; //u节点染红的话,子节点染不染红都可以
  11. }
  12. f[u][0] = m2; //u节点染红的方案数
  13. f[u][1] = m1; //u节点不染红的方案数
  14. }
  15. void solve(){
  16. cin >> n;
  17. for(int i = 1;i < n;i ++){
  18. int u, v;
  19. cin >> u >> v;
  20. e[u].push_back(v);
  21. e[v].push_back(u);
  22. }
  23. dfs(1, 0);
  24. cout <<(f[1][0] + f[1][1])%mod; //输出根节点的总方案数
  25. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号