首页 > 其他分享 >AtCoder Beginner Contest 280 D-E

AtCoder Beginner Contest 280 D-E

时间:2022-12-03 22:46:43浏览次数:60  
标签:AtCoder frac Beginner int inv 280 100 dp mod

D - Factorial and Multiple

前置知识

\(n!\)中包含素因子\(p\)的个数为

\[ cnt = \sum\limits_{k \geq 1}^{p^k \leq n} \lfloor \frac{n}{p^k} \rfloor \]

例如:\(n!\)中包含的2的个数可以这么找:先找1~n中2的倍数的个数\(\lfloor \frac{n}{2} \rfloor\),再找1~n中4的倍数的个数\(\lfloor \frac{n}{4} \rfloor\),再......直到\(2^k > n\)为止。

思路

先对k进行质因数分解,再二分\(n\)。

Code

#include <bits/stdc++.h>
using namespace std;
#define _u_u_ ios::sync_with_stdio(false), cin.tie(nullptr)
#define cf int _o_o_;cin>>_o_o_;for (int Case = 1; Case <= _o_o_;Case++)
#define SZ(x) (int)(x.size())
inline void _A_A_();
signed main() {
    #ifdef LOCAL
    freopen("in.in", "r", stdin);
    #endif
    _A_A_();
    _u_u_;
    return 0;
}

#define int long long
const int mod = 1e9 + 7;
const int maxn = 1e12 + 10;
const int N = 210, M = 5010;
const int inf = 0x3f3f3f3f;

int qpow(int a, int b) {
    int res = 1;
    while (b) {
        if (b & 1) {
            res = res * a;
        }
        a = a * a;
        b >>=1;
    }
    return res;
}

vector<pair<int,int>> p;

bool check(int mid ) {
    for (auto x : p) {
        int temp = 0;
        for (int i = 1;qpow(x.first,i) <= mid;i++) {
            temp += mid / qpow(x.first, i);
        }
        if (temp < x.second) return 0;
    }
    return 1;
}

inline void _A_A_() {
    int k,t;
    cin >> k;
    t = k;
    for (int i = 2;i <= sqrt(k);i++) {
        if (t % i == 0) {
            p.push_back({i,0});
        }
        while (t % i == 0) {
            p.back().second++;
            t /= i;
        }
    }
    if (t != 1) {
        p.push_back({t,1});
    }
    int l = 1, r = maxn;
    while (l < r) {
        int mid = l + r  >> 1;
        if (check(mid)) {
            r = mid;
        }
        else {
            l = mid + 1;
        }
    }
    cout << l << "\n";
}

E - Critical Hit

状态表示

\(dp[i]\)表示当将怪物打到还剩\(i\)生命值时攻击的期望次数。

转移方程

\[ dp[i] = (\frac{p}{100} * dp[i + 2] + (1 - \frac{p}{100}) * dp[i + 1] + 1) \bmod mod \]

编码的两种方法

这里将100在模mod下的逆元inv先求了出来,这样1-p/100就能表示为(100-p) * invp/100就能表示为p * inv

但是,无法得到正确答案。

inline void _A_A_() {
    int n, p;
    cin >> n >> p;
    int inv = qpow(100, mod - 2);
    dp[n] = 0;
    for (int i = n - 1;i >= 0;i -- ) {
        dp[i] = (p * inv * dp[i + 2] % mod + (100 - p) * inv * dp[i + 1] % mod + 1 + mod) % mod;
    }
    cout << dp[0] << "\n";
}

这里m表示p/100在模mod下的表示。这样1 - p/100就能表示为1 - m

这样答案正确!!!

inline void _A_A_() {
    int n, p;
    cin >> n >> p;
    int m = p * qpow(100, mod - 2) % mod;
    dp[n] = 0;
    for (int i = n - 1;i >= 0;i -- ) {
        dp[i] = (dp[i + 1] * (1 - m + mod) % mod + dp[i + 2] * m % mod + 1) % mod;
    }
    cout << dp[0] << "\n";
}

标签:AtCoder,frac,Beginner,int,inv,280,100,dp,mod
From: https://www.cnblogs.com/FanWQ/p/16948938.html

相关文章

  • ORA-28040: 没有匹配的验证协议
    问题:ORA-28040:没有匹配的验证协议原因:Oracle数据库安装的是12.2版本,OracleClient安装的版本是11(ODTwithODAC1120320_32bit)。解决:打开 sqlnet.ora 文件,增加以下两行......
  • mysql学习系列:总结数据库连接不上的数种情况,问题编号:ERROR 1045 (28000)
    (文章目录)场景今天重启CDH的时候,发现重启报错,查看日志才发现是mysql数据库连接不上。在尝试解决的过程中,踩到一些坑。所以总结一下,并分享给大家看看,减少大家伙继续踩坑的......
  • AtCoder Beginner Contest 247 题解
    AtCoderBeginnerContest247Solution目录AtCoderBeginnerContest247Solution更好的阅读体验戳此进入题面链接题面Luogu链接A-MoveRight题面SolutionCodeB-U......
  • 二维前缀和 P2280 激光炸弹
      #include<iostream>#include<algorithm>usingnamespacestd;ints[5005][5005],n,r;voidsov(){inti,j,ans=0;intx,y,z;cin>>n>>r;......
  • 2280. 最优标号
    题目链接2280.最优标号给定一个无向图\(G=(V,E)\),每个顶点都有一个标号,它是一个\([0,2^{31}-1]\)内的整数。不同的顶点可能会有相同的标号。对每条边\((u,v)\),我......
  • D - Freefall -- ATCODER
    D-Freefallhttps://atcoder.jp/contests/abc279/tasks/abc279_d思路求凹函数的极小值  https://www.cnblogs.com/luoyj/p/12408277.html#6#include<bits/stdc+......
  • atcoder
    [AGC012E]CamelandOases总结:\(\frac{V}{2}\)的操作只会进行\(O(\logV)\)次。状压左右两边用了哪些\(V\)就行了。正难则反,发现对于每个点都往两边\(dp\)复......
  • AtCoder Beginner Contest 279
    咕咕咕。D-Freefall三分求极值,注意下标得是整数,所以最后再搜索三分结果附近的整数。直接求导应该也可以。AC代码//#defineMULTIPLE_TASK#include"hira/main.cp......
  • AtCoder Beginner Contest 279
    A-wwwvvvvvv原题链接题意给出仅由v和w组成的字符串\(S\)。输出\(S\)中有多少个尖点(一个v有一个尖点,一个w有两个尖点)。分析输入字符串,遍历每个字符。如果这个......
  • TOYOTA SYSTEMS Programming Contest 2022(AtCoder Beginner Contest 279)A-D题(暂定)
    A,w是两个v是一个送分题#include<bits/stdc++.h>usingnamespacestd;#definemaxn400100#defineintlonglongintread(){intans=0,f=1;charch......