首页 > 其他分享 >数学概率拆分——cf_921_D.Good Trip

数学概率拆分——cf_921_D.Good Trip

时间:2024-02-02 21:35:03浏览次数:32  
标签:Good const int ll cf 期望 921 mod define

目录

问题概述

原题参考:D.Good Trip
大致意思就是一个老师带着n个孩子,其中有m对是朋友,每对朋友之间有一个友谊值,不是朋友的则是0,这个老师要出去玩k次,每次可以带上两个小朋友(为什么不能一起带,这是偏爱!!!),如果这两个小朋友是朋友关系的话,那么他们的友谊值会加1,如果不是的话,就不变,要求给出k次游玩带出去的小朋友的友谊值的期望值,已经证明该值可以表示为p/q,要求的是输出p/qmod1e9+7

Input:
4
100 0 24
2 1 10
1 2 1
3 1 2
2 1 1
5 2 4
1 2 25
3 2 24

Output:
0
55
777777784
40000020

思路想法

诶,写的时候想法就是完全错误的,就想着将这k次期望做成一个整体,但是写来写去公式又不对,忘了一件事和差期望无条件打开,如果将这k次的期望分开来算,之后加起来也是一样的,同样的,每次的期望又可以分为两个部分,一是孩子的友谊值的期望,一是友谊值变化的期望,分成两个部分就很好做了

参考代码

#include <bits/stdc++.h>
using namespace std;
#define FAST_IO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define pll pair<long long, long long>
#define pii pair<int, int>
#define vi vector<int>
#define vl vector<long long>
#define ll long long
#define ull unsigned long long
const ll INF = 9187201950435737471;
const int inf = 2139062143;
const ll mod = 1e9 + 7;
const double eps = 1e-6;
const double PI = acos(-1.0);
int n, m, k;
//快速幂求逆元操作
ll qpw(ll a, ll b, ll p) {
    ll res = 1;
    a %= p;
    while(b) {
        if(b&1) res *= a, res %= p;
        b >>= 1;
        a *= a, a %= p;
    }
    return res;
}
void solve() {
    cin >> n >> m >> k;
    ll b, s = 0;
    b = qpw(n*(n-1)%mod, mod-2, mod);
    int x, y, z;
    //记录友谊值总和
    for(int i=1; i<=m; i++) cin >> x >> y >> z, s += z, s %= mod;
    ll ans = 0;
    for(int i=1; i<=k; i++) {
        //每次的友谊值期望就是抽到m对朋友的概率乘以友谊值总和
        ans += 2 * b % mod * s % mod, ans %= mod;
        s += 2 * m * b % mod, s %= mod;
    }
    cout << ans << endl;
}
int main() {
#ifdef xrl
    freopen("in.txt", "r", stdin), freopen("out.txt", "w", stdout);
#endif
    FAST_IO;
    int t = 1;
    cin >> t;
    while(t --) solve();
#ifdef xrl
    cout << "Time used = " << (double)(clock() * 1.0 / CLOCKS_PER_SEC) << "s";
#endif
    return 0;
}

问题反思

为什么想写这道题呢(请看该分类的名称),其实是期望这玩意我总是算不对,做题的时候又喜欢钻牛角尖,所以写写加加印象,记住期望的和差无条件打开,二是nnd写这个的时候又爆了一次数据,记录一下,最开始的n是int的,之后交了一发cf提示爆数据了,我还在想哪里能爆,结果就是计算逆元的那个中间过程又爆掉了!!!气死我了,又是计算过程爆数据

标签:Good,const,int,ll,cf,期望,921,mod,define
From: https://www.cnblogs.com/notalking569/p/18004044

相关文章

  • [BSidesCF 2020]Had a bad day
    [BSidesCF2020]Hadabadday打开网站有两个按钮,点击之后链接后都会加上?category=meowers猜测有文件包含漏洞,尝试?category=php://filter/read=convert.base64-encode/resource=index.php警告中看到.php出现了两次,推测源码中存在.php拼接,于是去掉.php得到PHP源码<?p......
  • CF620E New Year Tree
    CF620ENewYearTree题意:给出一棵n个节点的树,根节点为1。每个节点上有一种颜色ci​。m次操作。操作有两种:1uc:将以u为根的子树上的所有节点的颜色改为c。2u:询问以u为根的子树上的所有节点的颜色数量。1<=c<=60。由于c的范围,可以用一个整数来表示每棵子......
  • CF1687D Cute number 题解
    题目链接点击打开链接题目解法一个数\(c\)是可爱(下文称为合法)的,当且仅当\(c\in[x^2,x(x+1)]\)令\(a_i\)属于\([x_i,x_i(x_i+1)]\)一个显然的范围是\(x_1\le2\times10^6\)考虑枚举\(x_1\)现在说明一个结论:\(x_1\)固定时,\(x_i\)也固定了说明:不难发现,合法的不合......
  • CF620E New Year Tree 题解
    题目链接:CF或者洛谷这题很简单,看到颜色数,HH的项链?树,树上的HH的项链?带修,树上的镜中的昆虫?\(c_i\le60\),噢,easy了。考虑一类信息,表示有和无,对于某种颜色来讲,\(0/1\)表示无或者有,而或运算让我们从小区间的有无情况反映到大区间的有无情况。一种暴力的想法,为每种颜色建立一棵有......
  • CF921 D. Good Trip
    题面代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineIOSios::sync_with_stdio(0);cin.tie(0);cout.tie(0);#definerep(i,a,n)for(inti=a;i<=n;i++)#defineper(i,a,n)for(inti=n;i>=a;i--)#definefirstfi#defineseconfse#defi......
  • CF922 div2 D. Blocking Elements
    题面代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineIOSios::sync_with_stdio(0);cin.tie(0);cout.tie(0);#definerep(i,a,n)for(inti=a;i<=n;i++)#defineper(i,a,n)for(inti=n;i>=a;i--)#defineendl"\n"#definefif......
  • CF125D 题解
    思路首先可以发现前三个数中的两个数一定为一个等差数列中,所以我们对于前三个数枚举哪两个数是一个等差数列中的,设这两个数的差为\(w\),在原数列中找到一个最长的公差为\(w\)的等差数列,记为\(A\),剩下的数记为\(B\),此时有三种可能。\(|B|=0\),此时可以知道原数组就是等差数列......
  • 从CF1737学习区间计数处理与开方精度丢失问题
    Problem-B-Codeforces思路出来之后,需要计算\(l,r\)区间的个数。我想的是计算出\([0,r]\)的个数和\([0,l]\)的个数,然后相减。大体上是没问题,但是我的实现麻烦而且有错误。初始代码voidsolve(){lll,r;cin>>l>>r;autocalc=[&](llx,bool......
  • CF1753D 题解
    因为最后要找的是“腾出空位”的最小代价。所以不妨把“障碍的移动”转化为“空位的移动”。令\(f_{x,y}\)为:使得\((x,y)\)为空,至少需要多少代价。下面来找转移方程,显然转移方程与空格子移动有关。所以观察空格子移动的规律。若当前格子\((x,y)\)为L。以\((x,y+1)\)......
  • CF920 G. List Of Integers
    \(t\)组询问,求第\(k\)个大于\(x\)且与\(p\)互质的数。看到第\(k\)大这个东西,首先想到二分答案。令当前的二分中点为\(m\),那么如果\([x+1,m]\)中与\(p\)互质的数大于等于\(k\)个,往下缩小二分范围。否则往上缩小二分范围。同时,求\([x+1,m]\)中与\(p\)......