首页 > 其他分享 >CSP模拟7

CSP模拟7

时间:2023-07-27 19:44:19浏览次数:33  
标签:奇数 int dfrac long 模拟 长度 CSP dp

A. 卷

一道可爱的树形 DP 喵!

题目保证了 \(w_i\) 是在给定范围内随机生成的,所以不会炸精度。

首先明确题意,是求出最大乘积独立集之后取模,而不是边乘边取模。边乘边取模会炸,例如 \(10^9 +8\) 对 \(10^9+ 7\) 取模后小于 \(2\),但显然 \(10^9 + 8 > 2\)。

那怎么办呢?高精?

可以用我们对数离散,由于

\[\log{a \times b}=\log a + \log b \]

所以,我们可以把乘法转化为加法,开一个数组 \(f\) 存储未取模的结果用对数表示,用它来判断大小,再用数组 \(dp\) 储存答案。

记得开 \(\text{long double}\) 和 \(\text{long long}\)。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

#define int long long

const int N = 200500;
const int Mod = 1e9 + 7;

// Graph
struct Edge{
    int next,to;
}e[N << 2];

int h[N],cnt;

void Add(int u,int v) {
    cnt ++;
    e[cnt].next = h[u];
    h[u] = cnt;
    e[cnt].to = v;

    return ;
}

int n,w[N];

long double f[N][2];
int dp[N][2];

// DP 
void dfs(int x,int fa) {
    f[x][1] = log(w[x]);
    f[x][0] = 0;
    dp[x][1] = w[x] % Mod;
    dp[x][0] = 1;

    for(int i = h[x];i; i = e[i].next) {
        int to = e[i].to;

        if(to == fa)
            continue;
        
        dfs(to,x);

        if(f[to][0] > f[to][1])
            dp[x][0] = dp[x][0] * dp[to][0] % Mod;
        else   
            dp[x][0] = dp[x][0] * dp[to][1] % Mod;

        f[x][0] += max(f[to][0],f[to][1]);
        f[x][1] += f[to][0];
        dp[x][1] *= dp[to][0];
        dp[x][1] %= Mod;
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin >> n;
    for(int i = 1;i <= n; i++) {
        cin >> w[i];
    }
    for(int i = 1,u,v;i < n; i++) {
        cin >> u >> v;
        Add(u,v);
        Add(v,u);
    }

    dfs(1,0);

    if(f[1][0] > f[1][1])
        cout << dp[1][0];
    else    
        cout << dp[1][1];
    return 0;
}

B. 简单题

首先我们可以把这个集合拆成很多条链,每条链的形式都是

\[i \rightarrow i \times 2^1 \rightarrow i \times 2^2 \rightarrow \cdots \rightarrow i \times 2^k$$的形式。 这些链的开头都是奇数(因为偶数肯定是其他数的 $2$ 倍),链长都是 $\log$ 级别。 对于一条链,一定是隔一个选一个,把它分成 $A$ 和 $B$ 两个集合。 对于偶数长的链,两部分的长度相等,都为 $\dfrac{len}{2}$; 对于奇数长的链,其中一部分会比另一部分多 $1$,二者为 $\left\lfloor\dfrac{len}{2}\right\rfloor$ 和 $\left\lfloor\dfrac{len}{2}\right\rfloor +1$。 所以我们可以发现,集合 $A$ 的大小一定大于所有偶数链长度和所有奇数链长度较短的一部分长度的和,这部分我们设为 $base$。 然后就是选择链中部分的方法,偶数链要么从第一个数开始选,要么从第二个数开始选,共两种方法,即 $2^{cnt}$ 种。 奇数链的方案数就是从奇数链数量中选取 $m - base$ 条链的方案数,要用卢卡斯定理。 然后就是要求各个长度的链的个数了。 设一条链的长度为 $i + 1$,开头数为 $x$,所以除了 $x$ 以外链中有 $i$ 个数。 我们可以得到 $$x \cdot 2^i \leq n < x \cdot 2^{i + 1}\]

变化一下,我们得到

\[\dfrac{n}{2^{i+1}} < x \leq \dfrac{n}{2^i} \]

由于链都是以奇数为开头的,所以,对于长度为 \(i + 1\) 的链,链的数量为 \(x\) 所在区间中奇数的个数。

所以我们可以枚举链的长度,然后计算出区间内奇数数量,然后得到该长度下链的数量。

这道题就可以完结了。

咕咕咕

标签:奇数,int,dfrac,long,模拟,长度,CSP,dp
From: https://www.cnblogs.com/baijian0212/p/csp-7.html

相关文章

  • CSP 模拟 5
    T1第一题贪心,观察肯定是从较浅的点上来一个士兵或者从根节点来一个士兵,用set或者vector启发式合并维护这个过程即可点击查看代码#include<bits/stdc++.h>#defineN100005#defineinf0x3f3f3f3f#definepiipair<int,int>#definempmake_pairusingnamespacestd;......
  • set.a.light 3D STUDIO - 3D摄影棚模拟布光软件mac/win版
    set.a.light3DSTUDIO是一款专业的摄影灯光模拟软件,为摄影师和摄影爱好者提供了一个真实、细致的虚拟摄影棚环境。它可以帮助用户在计算机上进行灯光设置和调整,以达到理想的照片效果。→→↓↓载set.a.light3DSTUDIO set.a.light3DSTUDIO具有丰富的功能和直观的界面,使用......
  • 第一次模拟赛总结
    第一次摸底考试总结考试结果成绩:\(100+100+80+0+70+0=350\)排名:#\(18\)逐题分析C钱到题出现の问题约瑟夫环使用了数组进行维护,取模麻烦,使用std::queue更为方便坑点队列q需要进行初始化正确代码#include<bits/stdc++.h>usingnamespacestd;intmain(){......
  • 2023 暑假集训模拟赛 Day 3
    比赛题目共\(2\)套,其中初赛题\(1\)套,复赛\(2\)题。比赛时间:\(10:50-12:00a.m\)。Part0x01过程-Process\(8:30\,a.m.\)做初赛题目;\(10:40\,a.m.\)拿到题目;\(10:41\,a.m.\)先写\(\text{T1}\),发现有点像分类讨论;\(10:50\,a.m.\)发现\(\text{T1}\)不需要那......
  • CSP6
    T1题目描述给出一个长为的排列,请你把它排序。排序方法是:定义一种操作表示交换,先找到所有逆序对满足,任意排成一个排列,使得按照这个顺序操作以后是单调递增的。如果有多种排列,输出任意一种。输入格式第一行输入,第二行输入数组。保证是排列。输出格式如果不存在答案,输出。否则......
  • 【垫底模拟】CSP模拟-6
    新系列,系列名叫垫底模拟,厉害吧T1排序最开始想的都是很简单的东西,就是把最大的数放到最后嘛,然后发现显然不行,比如说:hack:input:515324output:34252423题目很明显地告诉我们先输出逆序对数\(m\)再输出交换\(m\)行操作,这\(m\)次操作还必须针对我们求......
  • 视频直播系统源码,vue自定义模拟滚动条
    视频直播系统源码,vue自定义模拟滚动条vscroll自定义滚动条模板 <template> <divclass="vui__scrollbar"ref="ref__box"@mouseenter="handleMouseEnter"@mouseleave="handleMouseLeave"v-resize="handleResize">  <div:......
  • 2023 暑假集训模拟赛 Day 2
    比赛题目共2套,其中初赛题1套,复赛2题。比赛时间:\(10:50-12:00a.m\)Part0x01过程-Process\(8:40\,a.m.\)做初赛题目;\(10:40\,a.m.\)拿到题目;\(10:51\,a.m.\)先写\(\text{T2}\),发现是初赛考过的题目,但时限变小;\(11:20\,a.m.\)在\(\text{T2}\)上花了太久,没调出来,......
  • 蒙特卡洛模拟
    MonteCarloSimulationIntroduction蒙特卡洛是西欧小国摩纳哥最著名的一区,以豪华的赌场闻名于世。(赌场,意味着大量重复的随机过程)蒙特卡洛模拟是一种,通过大量随机采样,预测不确定事件可能结果的的数学技术。这个想法的数学保证是大数定律(Lawoflargenumbers):样本数量越多,则其算......
  • 3.1 模拟 参考代码
    P2670[NOIP2015普及组]扫雷游戏#include<cstdio>charmine[105][105];intdx[8]={-1,-1,-1,0,0,1,1,1};intdy[8]={-1,0,1,-1,1,-1,0,1};intmain(){intn,m;scanf("%d%d",&n,&m);for(inti=0;i<n;......