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 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> CF 1559 E. Mocha and Stars (莫比乌斯反演+DP) -> 正文阅读

[开发测试]CF 1559 E. Mocha and Stars (莫比乌斯反演+DP)

链接

题意:

给出n,m求满足以下条件的方案数

  • a i ∈ [ l i , r i ] ( i ∈ [ 1 , n ] ) a_i \in [l_i,r_i] (i\in[1,n]) ai?[li?,ri?](i[1,n])
  • ∑ i = 1 n a i ≤ m \sum_{i=1}^na_i\leq m i=1n?ai?m
  • gcd ? ( a 1 , a 2 , . . . , a n ) = 1 \gcd(a_1,a_2,...,a_n)=1 gcd(a1?,a2?,...,an?)=1

结果对998244353取模

分析:

首先我们抛开第三个条件 g c d gcd gcd不看,那么这个就可以 O ( n m ) O(nm) O(nm)求, n ≤ 50 , m ≤ 1 e 5 n\leq50,m\leq 1e5 n50,m1e5所以不会超时。但是有了这个限制条件,我们就需要看看如果才能实现这个限制条件。
首先我们定义 f ( a 1 , a 2 , . . . a n ) = ∑ i = 1 n a i < = m f(a_1,a_2,...a_n)=\sum_{i=1}^na_i<=m f(a1?,a2?,...an?)=i=1n?ai?<=m
∑ a i = l 1 r 1 ∑ a i = l 2 r 2 ∑ a i = l 3 r 3 . . . . ∑ a i = l n r n f ( a 1 , a 2 , . . . . a n ) [ gcd ? ( a 1 , a 2 , . . . , a n ) = 1 ] \sum_{a_i=l_1}^{r_1}\sum_{a_i=l_2}^{r_2}\sum_{a_i=l_3}^{r_3}....\sum_{a_i=l_n}^{r_n}f(a_1,a_2,....a_n)[\gcd(a_1,a_2,...,a_n)=1] ai?=l1?r1??ai?=l2?r2??ai?=l3?r3??....ai?=ln?rn??f(a1?,a2?,....an?)[gcd(a1?,a2?,...,an?)=1]
这里我们看到 [ g c d ( a 1 , a 2 . . . . . a n ) = 1 ] [gcd(a_1,a_2.....a_n)=1] [gcd(a1?,a2?.....an?)=1]我们想到莫比乌斯反演。
∑ a i = l 1 r 1 ∑ a i = l 2 r 2 ∑ a i = l 3 r 3 . . . . ∑ a i = l n r n f ( a 1 , a 2 , . . . . a n ) ∑ d ∣ gcd ? ( a 1 , a 2 , . . . , a n ) μ ( d ) \sum_{a_i=l_1}^{r_1}\sum_{a_i=l_2}^{r_2}\sum_{a_i=l_3}^{r_3}....\sum_{a_i=l_n}^{r_n}f(a_1,a_2,....a_n)\sum_{d|\gcd(a_1,a_2,...,a_n)}\mu(d) ai?=l1?r1??ai?=l2?r2??ai?=l3?r3??....ai?=ln?rn??f(a1?,a2?,....an?)dgcd(a1?,a2?,...,an?)?μ(d)
d ∣ gcd ? ( a 1 , a 2 , . . . , a n ) d|\gcd(a_1,a_2,...,a_n) dgcd(a1?,a2?,...,an?)说明 a 1 , a 2 . . . a n a_1,a_2...a_n a1?,a2?...an?都是d的倍数。
∑ a i = l 1 r 1 ∑ a i = l 2 r 2 ∑ a i = l 3 r 3 . . . . ∑ a i = l n r n f ( a 1 , a 2 , . . . . a n ) ∑ d ∣ a 1 & d ∣ a 2 , . . . & d ∣ a n μ ( d ) \sum_{a_i=l_1}^{r_1}\sum_{a_i=l_2}^{r_2}\sum_{a_i=l_3}^{r_3}....\sum_{a_i=l_n}^{r_n}f(a_1,a_2,....a_n)\sum_{d|a_1\&d|a_2,...\&d|a_n}\mu(d) ai?=l1?r1??ai?=l2?r2??ai?=l3?r3??....ai?=ln?rn??f(a1?,a2?,....an?)da1?&da2?,...&dan??μ(d)
提取d,发现d最大是m。
∑ d = 1 m μ ( d ) ∑ a i = l 1 d r 1 d ∑ a i = l 2 d r 2 d . . . . . . . . . ∑ a i = l n d r n d f ( a 1 , a 2 , . . . . a n ) \sum_{d=1}^{m}\mu(d)\sum_{a_i=\frac{l_1}{d}}^{\frac{r_1}{d}}\sum_{a_i=\frac{l_2}{d}}^{\frac{r_2}{d}}.........\sum_{a_i=\frac{l_n}{d}}^{\frac{r_n}{d}}f(a_1,a_2,....a_n) d=1m?μ(d)ai?=dl1??dr1???ai?=dl2??dr2???.........ai?=dln??drn???f(a1?,a2?,....an?)

综上,我们会发现,如果 μ ( d ) \mu(d) μ(d)等于0,后面的也就不用计算了。
f ( ) f() f()用DP来做就好了.

注意莫比乌斯反演最终形式不一定有整除分块的形式。

int prime[maxn],mu[maxn],l[maxn],r[maxn];
bool isprime[maxn];
int n,m, cnt;
ll a[maxn],b[maxn];
void init()
{
    mu[1]=isprime[1]=1;
    for(int i = 2; i < maxn; i++)
    {
        if(!isprime[i]) prime[++cnt] = i,mu[i]=-1;
        for(int j = 1; j <= cnt && prime[j]*i < maxn; j++)
        {
            isprime[i * prime[j]] = true;
            if(i % prime[j] == 0) break;                
            mu[i*prime[j]]=-mu[i];
        }
    }
}

int dp[maxn],f[maxn];
void solve()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d%d",&l[i],&r[i]);
    
    ll ans=0;
    for(int i=1;i<=m;i++){
        if(mu[i]==0) continue;
        for(int j=1;j<=n;j++){            
            a[j]=(l[j]+i-1)/i;
            b[j]=r[j]/i;            
        }
        int sum=m/i;
        for(int j=0;j<=sum;j++) dp[j]=1;

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

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 -2025/4/4 3:49:53-

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