CF 1097D - Hello 2019 D题: Makoto and a Blackboard

目录

  • Catalog
  • Solution:

(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

Catalog

Problem:传送门

?Portal

?原题目描述在最下面。

?给一个数n,由k次操作。每次操作等概率的把n变成他的一个因数(\(1\leq x\leq n\)),问k次操作后得到的数的期望是多少。

Solution:

\(n = p1^{a1}*...*pm^{am}\)
积性函数: \(fk(n) = fk(p1^{a1})*...*fk(pm^{am})\)
\(dp[j]\) 表示\(pi^j\)执行\(k\)次操作之后的结果的期望
\(dp[j] = sigma(dp[j-1])/yinzi\_num\)
\(yinzi\_num = j+1\)

AC_Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MXN = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const LL mod = 1000000007;
const LL MOD = 5631653553151;

LL n;
int k;
LL inv[MXN];
LL calc(LL x, int p) {
    std::vector<LL> dp(p+1);
    dp[0] = 1;
    for(int i = 1; i <= p; ++i) {
        dp[i] = dp[i-1] * x % mod;
    }
    for(int t = 0; t < k; ++t) {
        for(int i = 1; i <= p; ++i) dp[i] = (dp[i-1]+dp[i]) % mod;
        for(int i = 1; i <= p; ++i) dp[i] = dp[i] * inv[i+1] % mod;
    }
    return dp[p];
}
int main() {
    inv[1] = 1;
    for(int i = 2; i < MXN; ++i) inv[i] = inv[mod%i]*(mod-mod/i)%mod;
    scanf("%lld%d", &n, &k);
    LL tn = n, ans = 1;
    int cnt;
    for(LL i  = 2; i * i <= n; ++i) {
        if(tn % i == 0) {
            cnt = 0;
            while(tn % i == 0) tn /= i, ++ cnt;
            ans *= calc(i, cnt);
            //printf("%lld %d\n", i, cnt);
            if(ans >= mod) ans %= mod;
        }
        if(tn == 1) break;
    }
    if(tn > 1) {
        ans *= calc(tn, 1);
    }
    printf("%lld\n", ans % mod);
    return 0;
}

Problem Description:

原文地址:https://www.cnblogs.com/Cwolf9/p/10225573.html

时间: 2024-10-09 22:18:17

CF 1097D - Hello 2019 D题: Makoto and a Blackboard的相关文章

CF 628A --- Tennis Tournament --- 水题

CF 628A 题目大意:给定n,b,p,其中n为进行比赛的人数,b为每场进行比赛的每一位运动员需要的水的数量, p为整个赛程提供给每位运动员的毛巾数量, 每次在剩余的n人数中,挑选2^k=m(m <=n)个人进行比赛,剩余的n-m个人直接晋级, 直至只剩一人为止,问总共需要的水的数量和毛巾的数量 解题思路:毛巾数很简单: n*p即可 水的数量:1,2,4,8,16,32,64,128,256,512,提前打成一个表, 根据当前剩余的人数n在表中二分查找最大的小于等于n的数,结果即为本次进行比赛

CF 628B New Skateboard --- 水题

CD 628B 题目大意:给定一个数字(<=3*10^5),判断其能被4整除的连续子串有多少个 解题思路:注意一个整除4的性质: 若bc能被4整除,则a1a2a3a4...anbc也一定能被4整除: 利用这个性质,先特判第一位数字是否能被4整除,可以则++cnt, 之后从第二位数字开始,设当前位为i,先判断a[i]能否被4整除,可以则++cnt, 再判断a[i-1]*10+a[i]能否被4整除,可以则cnt = cnt + (i) 相关证明: 设一整数各个位置为a1,a2,a3,...,an,b

CF 714D Searching Rectangles 交互题 二分

题意:交互题,已知一个n*n的地图,电脑藏了两个不相交的矩形(矩形的边和坐标轴平行).每次向电脑询问左下[x1,y1]右上[x2,y2]的矩形内完全包含多少个藏着的矩形.n<=2^16.请在200次内猜出两个矩形左下,右上坐标. 先二分出两个不相交矩形的分界线,要么横着要么竖着.接在在每一快中二分出矩形的四条边即可(最左,右,上,下边界) #include <bits/stdc++.h> using namespace std; int n,ans[20],cnt=0; inline i

cf 215 C. Crosses yy题

链接:http://codeforces.com/problemset/problem/215/C C. Crosses time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output There is a board with a grid consisting of n rows and m columns, the rows are n

cf 55D 数位dp 好题

/* 刚开始我考虑0的情况,想将他剔除就将lcmn设为-1,这样还要判断0和lcmn是-1的情况很麻烦而且但是一直出错 后来觉得不用管0的情况就行了,可以认为符合. 解:将lcmn离散化,因为1-9的公倍数必是2520的因子并且只有48个 所以用一个数组离散化,记忆的时候直接调用离散数组即可 因为一个数的所有数字的最小公倍数必定是2520的因子,所以将这个数对2520取余缩小范围并记忆 三维,第一个长度,第二个对2520取余,第三个是lcm值 */ #include<stdio.h> #inc

CTU Open Contest 2019 AB题

小菜鸡飘过 A: Beer Barrels 题意:给出四个整数:A,B,K,C,:A,B,C都是大于0的个位数,问在所有仅有A或者B组成的K位数中,数字C的个数是多少 思路: 1.先考虑特殊情况: (1) 如果C不是A或者B 则输出0 (2) 如果K = 0 则输出0 (3) 如果A==B 则输出K 2.再考虑一般情况: 共K位,每位都可能有C,求出共有多少种可能,排列组合问题. 多个 C(i,k)*I 相加 阶乘可以用数组模拟:用快速幂求逆元 AC代码: #include<bits/stdc+

codeforces1097D Makoto and a Blackboard 数学+期望dp

题目传送门 题目大意: 给出一个n和k,每次操作可以把n等概率的变成自己的某一个因数,(6可以变成1,2,3,6,并且概率相等),问经过k次操作后,期望是多少? 思路:数学和期望dp  好题好题!! 直接考虑n到因子很难做,所以要研究从n到因子的一些性质. 如果一个数可以写成,p^c这样的形式,并且p是质数,那么如果把这个数进行上述的操作,他可以变成的形式必然是p^x(0<=x<=c),并且每个数的概率是平均的. 所以对于这样的数,我们可以得出dp方程,i表示第几次操作,j表示p^j. dp[

CF1097D Makoto and a Blackboard

思路: 概率dp.首先对n进行因子分解得到,然后每个素因子pi,计算经过k次操作之后的期望值Ei,再利用期望的性质把所有Ei乘起来得到最终结果.Ei可以通过概率dp计算,dp[i][j]表示经过i次操作之后出现的概率. 实现: 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef long long ll; 5 6 const ll MOD = 1e9 + 7; 7 8 ll dp[10005][60]; 9 10 ll q

CF1097D 【Makoto and a Blackboard】

我们考虑对于一个\(N\),他如果变成了他的约数\(x\),那又会变成一个子问题 我们定义\(F(n, k)\)为n操作k次的期望个数 那么我们有\(F(n, k) =\sum_{x|n} F(x, k - 1) * \frac{1}{d}\)(其中d为n的约数个数) 因为\(N\)的约数个数肯定在\(\sqrt N\)以内现在我们就有了一个\(O(\sqrt N K)\)的暴力了 前面的\(\sqrt N\)肯定是不能省略了,我们可不可以对\(K\)下手呢? 我们考虑\(N\)是质数,那么答案