IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> CF1559E Mocha and Stars -> 正文阅读

[开发测试]CF1559E Mocha and Stars

CF1559E Mocha and Stars

思路

观察数据范围,大概 Θ ( n m log ? m ) \Theta(nm\log m) Θ(nmlogm) 是可行的

那么有了一个基本的想法, d p i , j dp_{i,j} dpi,j? 表示选到了第 i 位,且当前所选数的和是 j 的方法数

但是这样最后的 dp 值里面会有 gcd 不为 1 的情况

以下默认省略和不大于m

考虑容斥原理

如果 gcd 不为 1 ,那么它一定是某一个质数的倍数

所以减去所有 gcd 为质数倍数的情况,但是这样子我们会将一些 gcd 为特定值的部分多减去一次, 比如 gcd 为 6 的情况会被多减一次, 因为 2 减 3 也减

所以需要加上一些情况,可以发现所有因式分解下有两个及以上不同的质数的 gcd 都会被多减,那么加上 gcd 为所有因式分解中仅为两个不同素数的数(6, 15)的倍数的情况

会发现,这样又会有所有因式分解中有三个及以上不同的质数的 gcd 被多加,所以减去 gcd 为所有因式分解中仅为三个不同素数的数(30, 42)的倍数的情况

…递归下去

实际上,这种容斥系数有个专门的函数来表示,叫做莫比乌斯函数(我也是才知道)

暴力分解数的话,复杂度为 Θ ( m m ) \Theta(m\sqrt{m}) Θ(mm ?)? (wf算了1e12,但实际加一点剪枝远跑不满,本地循环内计数跑了1e8次)

但因为它是积性函数,也可以线性筛内递推求出来

那么知道容斥方法了,考虑怎么计算

如果要计算 gcd 为 x 的倍数的方案数,那么我们首先将 m/x , l/x(上取整), r/x(下取整)

这样当取一个数 i 的时候,相当于取了 i*x ,这就保证了答案是 gcd 为 x 的倍数的方案数

dp 时我做了一个前缀和优化,也可以另开一个数组用背包

代码

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef const int& cint;

const int mod = 998244353;
const int inf_int = 0x7fffffff;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;

int n, m;
ll l[51], r[51];
ll dp[51][100100];

ll sol(cint x) {
    for(int i=0; i<=m/x; i++) dp[0][i] = 1;
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m/x; j++) {
            dp[i][j] = 0;
            int dl = ceil((double)l[i]/x), dr = r[i]/x;
            if(dl > dr) return 0;
            if(j-dl >= 0) dp[i][j] += dp[i-1][j-dl];
            if(j-dr-1 >= 0) dp[i][j] -= dp[i-1][j-dr-1];
            dp[i][j] += dp[i][j-1];
            dp[i][j] = (dp[i][j] + mod) % mod;
        }
    }
    return dp[n][m/x];
}

int check(int x) {
    if(x == 1) return 1;
    int num = 0;
    int r = sqrt(x);
    for(int i=2; i<=r; i++) {
        if(!(x%(i*i))) return 2;
        if(!(x%i)) { 
            ++ num;
            x /= i;
        }
    }
    if(x > 1) ++num;
    return !(num&1);
}

int main() {
    cin >> n >> m;
    for(int i=1; i<=n; i++) cin >> l[i] >> r[i];
    ll ans = 0;
    for(int i=1; i<=m; i++) {
        if(check(i) == 1) ans += sol(i);
        else if(check(i) == 0) ans -= sol(i);
        ans = (ans+mod) % mod;
    }
    cout << ans << endl;
    return 0;
}
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:30:46  更:2021-08-25 12:32:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 5:28:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码