CF 439E Devu and Birthday Celebration

Maven项目整合JUnit 5:从依赖配置到持续集成的完整实践指南 单元测试是软件质量保障的基石,通过编写可重复、自动化的测试代码来验证程序单元的行为是否符合预期。其核心原理在于隔离被测代码,利用断言机制进行结果验证,从而在代码变更时快速发现回归错误。这一实践的技术价值在于提升代码可靠性、支持重构并促进持续集成。在Java生态中,JUnit是单元测试的事实标准,而Maven作为主流的项目构建工具,通过其标准的生命周期和目录约定,天然集成了测试环节。在Maven项目中配置JUnit,特别是现代版本的JUnit 5,并遵循`src/test/java`的目录规范,可以将测试无缝 阅读详情

题目描述

给你qq组询问,对于每组询问给出正整数n,f,求将nn拆分成f个正整数相加的形式的方案数,且这ff个正整数的最大公约数为1。答案对109+7109+7取模。

数据范围

1≤q≤105,1≤f≤n≤1051≤q≤105,1≤f≤n≤105

分析

PART 1 一个询问

第一眼看这个题目,如果只有1个询问而不是qq这个询问,那我们可以用类似D题的做法,我们设sum(x)表示将nn拆分成f个正整数相加的形式,且这ff个正整数gcd为xx的方案数,那么容易得到sum(x)=(nx−1f−1)−sum(2x)−sum(3x)−...−sum(kx)。至于这个是怎么来的呢?

首先一定有x∣nx∣n,那么我们可以把nn分为nx块,每块大小为xx。(如下图)
pht1
那么问题就相当于是在这nx−1个空隙中插入f−1f−1个隔板,这样保证分出来的ff个数的gcd一定是至少为xx;但是,不一定是所有的的分法得到的gcd都恰好是xx,也可能是2x,3x,4x...,kx,因此,我们要除去这些情况,也就是说,减去分出得到的gcdgcd是2x,3x,4x,...,kx2x,3x,4x,...,kx的情况,这样就得到了上面的式子。

(怎么样,这个口糊容斥是不是很完美?好吧我并不会用f(x)f(x)和g(x)g(x)的方法去证)

PART 2 Q个询问

然而题目不总是那么友好。题目给出qq个询问,更过分的是q居然到了105105!
如果我们每次询问都这样暴力做的话显然会超时,那怎么办呢?考虑到我们计算的时候肯能会有一些冗余的重复计算,这时候我们就会自然而然地想到一个叫做记忆化的东西。首先,我们刚刚的式子中只涉及到了一个状态,那是因为我们在给定nn和f的情况下。现在我们加入nn和f,可以表示出一个三维的状态,设DP[n][f][g]DP[n][f][g]表示把nn分成f份,gcdgcd为gg的方案数,则仍然有DP[n][f][g]=(ng−1f−1)−∑kg∣nDP[n][f][kg]。我们要求的就是DP[n][f][1]DP[n][f][1],则有DP[n][f][1]=(n−1f−1)−∑g∣n,g>1DP[n][f][g]DP[n][f][1]=(n−1f−1)−∑g∣n,g>1DP[n][f][g]。但是这样的话我们还需要计算这个DP[n][f][g]DP[n][f][g],这其实就是前面提到的问题,但是我们又去计算DP[n][f][g]DP[n][f][g],这样的话并没有减少冗余的计算。那么我们有什么方法来优化一下呢?我们再看一看上面的图,可以得到这样一个神奇的式子:DP[n][f][g]=DP[n/g][f][1]DP[n][f][g]=DP[n/g][f][1]。这个可以直接从状态表示的意义上利用最大公约数的一个性质((a1(a1,a2,..,af),a2(a1,a2,..,af),...,af(a1,a2,..,af))=1(a1(a1,a2,..,af),a2(a1,a2,..,af),...,af(a1,a2,..,af))=1)证明。或者说,(对于上面的图)我们把nn分成大小为g的ngng块之后,为了保证这个gcdgcd仍然为gg,那么我们就不能让这ng块分出来得到的gcdgcd大于11,用反证法,若这个分块后gcd大于11,那么可知原来的gcd一定大于gg。
这样,我们就可以省去最后一维,直接用DP[n][f]表示把nn拆分成f个正整数相加,且gcdgcd为11的方案数。当然,如果我们预处理出这个DP数组,时间和空间都是不允许的,因此我们只能在线处理。当然了,我们不能直接开这个DPDP数组,这时候我们就可以用一个叫mapmap的好东西,然后用一个pairpair表示一下nn和f的状态即可。

参考程序

// Codeforces 439 E
// Round #251 (Div. 2)
#pragma GCC optimize(3)     // 这些优化开关是给map准备的,不知道去了可不可以过,应该去掉也是不会T的
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include <cstdio>
#include <utility>
#include <map>
#define fir first
#define sec second
typedef long long LL;
typedef std::pair<int, int> P;
typedef std::map<P, int> Arr;
const int MAXN = 100005;
const int MOD = 1000000007;

int inv[MAXN], fac[MAXN];
Arr DP;

int pow(int bs, int ex) {   // 快速幂
    int res = 1;
    for (; ex; ex >>= 1, bs = (LL)bs * bs % MOD) if (ex & 1) res = (LL)res * bs % MOD;
    return res;
}
inline void subtrac(int & x, int d) { x = x + MOD - d; while (x >= MOD) x -= MOD; }
inline int C(int n, int r) { return (LL)fac[n] * inv[r] % MOD * inv[n - r] % MOD; }     // 算组合数
void init();
int dp(P);
namespace FastIO {
    template <typename T>
    void read(T & x) {
        x = 0; register char ch = getchar();
        for (; ch < '0' || ch > '9'; ch = getchar());
        for (; ch >= '0' && ch <= '9'; x = (x << 3) + (x << 1) + (ch ^ '0'), ch = getchar());
    }

    template <typename T>
    void write(T x) {
        if (!x) return (void)(putchar('0'));
        register int arr[15], len = 0;
        for (; x; arr[len++] = x % 10, x /= 10);
        while (len) putchar(arr[--len] ^ '0');
    }

    template <typename T>
    inline void writeln(T x) {
        write(x), putchar('\n');
    }
}

int main() {
    init();
    int Q, n, f;
    using FastIO::read;
    read(Q);
    for (int i = 0; i < Q; i++) {
        read(n), read(f);

        FastIO::writeln(dp(P(n, f)));
    }
    return 0;
}

void init() {   //  预处理1e5以内的阶乘极其逆元
    int i, j, k;
    for (fac[0] = i = 1; i <= 100000; i++) fac[i] = (LL)i * fac[i - 1] % MOD;
    inv[100000] = pow(fac[100000], MOD - 2);
    for (i = 99999; i >= 0; --i) inv[i] = (LL)(i + 1) * inv[i + 1] % MOD;
}

// 核心部分就这么一点点
int dp(P now) {
    if (DP.find(now) != DP.end()) return DP[now];
    if (now.sec == 1 && now.fir > 1 || now.sec > now.fir) return 0;     // 这里要特别注意,不合法的状态直接返回0即可,不要再存入map,否则非常耗时间,会TLE,一开始就是因为这个T了半天
    int & res = DP[now];
    res = C(now.fir - 1, now.sec - 1);
    for (int k = 2; (LL)k * k <= now.fir; k++)
        if (!(now.fir % k)) {
            subtrac(res, dp(P(now.fir / k, now.sec)));
            if (k * k != now.fir) subtrac(res, dp(P(k, now.sec)));
        }
    return res;
}

总结

这题如果没有那qq个询问,其实并不难。加上询问之后的重点主要在于对冗余计算的处理,再把之前对一个询问的做法变成加上n和ff两维,最后最最重要的地方在于省去g那一维的变形,那个变式若推出来了,整到题也就做完了。

附 更加数学性的做法

其实上述做法为口糊容斥,不过挺好…
那么我们应该怎么像之前一样用f(x)f(x)和g(x)g(x)的方式去推理呢?

以下内容来自Codeforces
类似于上面的DP方程,令F(n,f,g)F(n,f,g)表示将正整数nn分成f份,gcdgcd为gg的方案数;令P(n,f)为把nn分成f个正整数相加的形式的方案数,即(n−1f−1)(n−1f−1)。那么有F(n,f,1)=P(n,f)−∑g∣n,g≠1F(n,f,g)F(n,f,1)=P(n,f)−∑g∣n,g≠1F(n,f,g),又由F(n,f,g)=F(ng,f,1)F(n,f,g)=F(ng,f,1),移项得P(n,f)=∑g∣nF(ng,f,1)P(n,f)=∑g∣nF(ng,f,1)。其实这个式子我们通过刚刚对DP转移方程的推理也是可以得到的,不过我们要把这个式子反演过来并不能用我们以前的方法———它不含有那些组合数。事实上呢,这个要用到数论里的一个反演技巧——莫比乌斯反演。
就是这样的

如果两个函数满足:
g(n)=∑d∣nf(d),foreveryintegern≥1g(n)=∑d∣nf(d),foreveryintegern≥1
那么有f(n)=∑d∣nμ(d)g(nd),foreveryintegern≥1f(n)=∑d∣nμ(d)g(nd),foreveryintegern≥1

在这里g(n)g(n)即P(n,f)P(n,f),f(n)f(n)即F(n,f,1)F(n,f,1)。

基于CrewAI框架构建多智能体科研协作系统:从原理到实践 多智能体系统是人工智能领域的重要研究方向,它通过多个智能体之间的协作与协调来解决复杂任务。其核心原理在于将复杂问题分解为子任务,由不同角色的智能体分工完成,并通过通信机制实现信息共享与决策协同。这种架构在提升任务处理效率、增强系统鲁棒性方面具有显著技术价值,广泛应用于自动驾驶、机器人协作、分布式计算等场景。本文聚焦于CrewAI这一多智能体协作框架,深入探讨如何利用Claude等大语言模型构建专业化的科研协作团队。通过定义智能体角色、任务流程和协作机制,该系统能够模拟真实科研团队的工作模式,实现从文献调研到 阅读详情

相关推荐

工业互联网工控安全与工业质检AI大模型建设方案.pptx

工业互联网工控安全与工业质检AI大模型建设方案.pptx

439 E. Devu and Birthday Celebration

/* 题目大意:有n个物品,分成f份,这f份的最大公约数是1的种类数目 记答案为P(n,f,1) 则有sigma(P(n,f,i)) = C(n-1,f-1)(n件物品分为f份的总方法数) 注意到P(n,f,i) = P(n/i,f,1). 我们可以记P(n,f,1)为g(n,f) 则有sigma(d|n) g(d,f) = C(n-1,f-1). 令右边为f(n,f) 则可以利用

\*zyeric*/ 531

2024 《计算机网络》实验教学指导书.doc

2024 《计算机网络》实验教学指导书.doc

[CodeForces 439E] Devu and Birthday Celebration(莫比乌斯反演) | 错题本

文章目录题目分析代码 题目 [CodeForces 439E] Devu and Birthday Celebration 分析 莫比乌斯函数比较重要的性质:μ∗1=ε\mu * 1 = \varepsilonμ∗1=ε 即 ∑d∣nμ(d)=[n=1]\sum_{d | n}\mu(d) = [n = 1]d∣n∑​μ(d)=[n=1] 证明: 设 n=∏i=1mpiαin = \prod_{i = 1}^{m} p_i^{\alpha_i}n=∏i=1m​piαi​​,n′=∏i=1mpin' = \

ixRic 266

高通SA8155P车载Camera开发避坑指南:从硬件拓扑到AIS服务调试全流程

本文详细解析了高通SA8155P车载Camera开发全流程,从硬件拓扑设计到AIS(Automotive Imaging System)服务调试,涵盖关键组件配置、软件架构剖析及高级调试技巧。通过实战经验分享,帮助开发者避开常见陷阱,优化系统性能,适用于智能驾驶系统的环境感知开发。

weixin_42550597的博客 331

cadence—virtuosoic617的使用技巧收集区

cadence使用

qq_33599939的博客 3万+

Codeforces 439E Devu and Birthday Celebration (容斥定理+组合)

题目链接:http://codeforces.com/problemset/problem/439/E #include&lt;bits/stdc++.h&gt; using namespace std; #define debug puts("YES"); #define rep(x,y,z) for(int (x)=(y);(x)&lt;(z);(x)++) #define ll lon...

满月照亮的路 269

07. 基础实战篇 - STP的基本配置

STP(生成数协议)是一个用于在局域网中消除环路的协议,他的标准是IEEE802.1d。STP通过强制使部分冗余链路处于阻塞状态,其它链路处于转发状态,将环形网络结构修剪成无环路的树形网络结构。可实现消除环路,当处于转发状态的链路不可用时,STP重新配置网络,并激活合适的备用链路状态,恢复网络连通性。

weixin_39868387的博客 7224

CF #439 E The Untended Antiquity

CF #439 E The Untended Antiquity随机化·二维BIT题解:添加一个矩形相当于为矩形内部的每个点都打上一个“在某个矩形内”的标记。查询的时候只要查询两个点的标记序列是否完全一样就行了。标记序列不好维护,直接把它变成一个数,类似于对它hash。要求可以撤销,xor是一个不错的选择。加减好像也可以。为了减少冲突,每个矩形的标记设为一个随机的unsigned long long

FTM's Blog 384

2.2.1.3-移动平均线(python画k线、均线、5日线、买卖点图、python均线策略)

* 绘制一个k线图,也就是蜡烛图 * 计算5日均线值、10日均线值 * 在k线图上,绘制5日线和10日线图 * 在5日线上,绘制与10日线的交叉点(上穿、下穿时) python画k线、均线、5日线、买卖点图、python均线策略

KelvinLiu 3413

实测iOS和安卓大不同!用NFC触发小程序跳转的完整避坑指南(含NFC Tools配置)

本文深入解析iOS与安卓在NFC触发小程序跳转时的核心差异,提供微信与支付宝小程序的NFC实现方案及优化技巧。涵盖跨平台兼容性测试方法论、性能优化策略及异常处理方案,帮助开发者避开常见陷阱,提升跳转成功率。特别针对NFC Tools配置和微信Universal Link使用进行详细指导。

asdfghjkl978564的博客 433

CF 439 E. Devu and Birthday Celebration 莫比乌斯反演

E. Devu and Birthday Celebration time limit per test 5 seconds memory limit per test 256 megabytes input standard input output standard output Today is Devu's birthday.

I will Do iT @ hlyblog.net 1392

环形平滑标签(Circular Smooth Label, CSL)技术详解

环形平滑标签(CSL)是一种优化算法,旨在解决旋转目标检测中角度预测的边界问题。通过将角度回归转化为分类任务,并利用窗口函数平滑标签分布,CSL有效处理了角度周期性的梯度突变问题。其核心原理包括角度离散化和平滑标签编码,通过高斯、矩形、三角等窗口函数生成概率分布。CSL在技术实现上涉及标签转换流程、模型结构调整和损失函数优化,显著提升了检测精度和稳定性。在DOTA数据集上的实验表明,CSL在mAP和角度误差方面优于传统方法。应用场景包括遥感图像分析、自动驾驶和工业质检,部署时需注意旋转NMS编译和ONNX导

浩瀚之水的专栏 640

CF439E Devu and Birthday Celebration 题解

q次询问,每次给出nf,求存在多少个长度为f的序列aai​01≤i≤f∑i1f​ai​ngcda1​a2​a3​....af​11≤qnf≤105。

weixin_73725403的博客 967

基于 YOLOv26 的校园安全监控系统:多场景应用

本文提出了一种基于YOLOv26的校园安全监控系统,采用多场景应用架构实现对校园安全的智能监测。系统核心技术包括YOLOv26目标检测、DeepSORT目标跟踪、区域安全定义和行为分析等模块,通过边缘计算平台实现实时处理。研究构建了包含多种校园场景的专业数据集,并采用数据增强技术提升模型性能。系统可检测人员、车辆和物品等目标,分析其行为轨迹,评估安全风险并触发告警。实验结果表明,该系统能有效识别校园安全隐患,为安全管理提供智能化解决方案。

一键难忘的博客 501

2025年CSP-J复赛真题及题解:T4 多边形(polygon)

2025年CSP-J复赛真题及题解:T4 多边形(polygon)

王老师青少年编程 1716

CF(439E - Devu and Birthday Celebration)莫比乌斯容斥

题意:将n个糖果插入f-1个挡板分成f分(a1,a2,a3...af)。问有多少种分法能够使得gcd(a1,a2,a3...af)=1; 解法。莫比乌斯容斥,首先按1为单位分,这时候有C(n-1,f-1)种,然后去掉gcd不是1的。这时候就规定质因子个数是奇数的就减(mou值为-1),偶数的为加(mou值...

weixin_30535913的博客 133

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Codeforces 439E Devu and Birthday Celebration(计数问题)

题目链接:Codeforces 439E Devu and Birthday Celebration 题目大意:给出q,表示询问的次数,每次询问有n和f,问有多少种分类方法,将n分成f份,并且这f份的最大共约数为1. 解题思路:如果不考虑说最大共约数为1的话,那么问题很简单,就是f个数的和为n的种数C(f−1n−1).所以我们就尽量将问题转化成说f数的和为s的子问题。用容斥原理,总的可

不慌不忙、不急不躁 1514

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

codeforces439E: Devu and Birthday Celebration

Description Today is Devu's birthday. For celebrating the occasion, he bought n sweets from the nearby market. He has invited his f friends. He would like to distribute the sweets among them. As

lqybzx的专栏 643

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

codeforces 439 E. Devu and Birthday Celebration 组合数学 容斥定理

题意: q个询问,每一个询问给出2个数sum,n 1 <= q <= 10^5, 1 <= n <= sum <= 10^5 对于每一个询问,求满足下列条件的数组的方案数 1.数组有n个元素,ai >= 1 2.sigma(ai) = sum 3.gcd(ai) = 1 solution: 这道题的做法类似bzoj2005能量采集 f(d...

weixin_30273501的博客 131

CodeForces 439 E.Devu and Birthday Celebration(莫比乌斯反演+组合数学)

Description 问满足gcd(a1,a2,...,af)=1,∑i=1fai=ngcd(a1,a2,...,af)=1,∑i=1fai=ngcd(a_1,a_2,...,a_f)=1,\sum\limits_{i=1}^fa_i=n的序列aaa的个数 Input 第一行一整数TTT表示用例组数,每组用例输入两个整数n,fn,fn,f表示一组查询(1≤T≤105,1≤f≤n≤105)(...

ZSQ 550

439 E. Devu and Birthday Celebration 莫比乌斯反演

E. Devu and Birthday Celebration 题意:有q次询问,每次询问n,k,要你把n分成 k 块,任意两块gcd=1的方案数。n,k,q最大均为1e5。 设f(n,k,i)为把n分成k块,任意两块gcd为 i 的方案数。 设F(n,k,i)为把n分成k块,任意两块gcd为  i 的倍数的方案数。 很显然:                            ...

ccsu_cat 303

codeforces 251E: Devu and Birthday Celebration(求把这个n分成f块,切这f块的gcd为1有多少种方法)

传送门:codeforces 251E: Devu and Birthday Celebration题意:有一个q表示查询次数(q<=1e5),然后接下来一个n,f(1≤f≤n≤10^5),求把这个n分成f块,切这f块的gcd为1有多少种方法思路:因为n<=1e5,所以每个数的因子最多有2^6个(2*3*5*11*13*17>1e5)所以我们对于每一个查询都可以枚举它的因子,然后利用莫比乌斯去重

_zidaoziyan的博客 671

Codeforces 451E Devu and Flowers(容斥原理)

题目链接:Codeforces 451E Devu and Flowers 题目大意:有n个花坛,要选s支花,每个花坛有f[i]支花。同一个花坛的花颜色相同,不同花坛的花颜色不同,问说可以有多少种组合。 解题思路:2n的状态,枚举说那些花坛的花取超过了,剩下的用C(n−1sum+n−1)隔板法计算个数,注意奇数的位置要用减的,偶数的位置用加的,容斥原理。 #include #inc

不慌不忙、不急不躁 3664

Summer Training day4 cf439E 莫比乌斯反演

Today is Devu's birthday. For celebrating the occasion, he bought n sweets from the nearby market. He has invited his f friends. He would like to distribute the sweets among them. As he is a nice gu

SUNSET 340
上一篇: Vjudge Contest0 @2018-08-04
下一篇: TC SRM567 DIV2 T3 MountainsEasy
「已注销」
博客等级 码龄9年 13粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值