P3301 [SDOI2013]方程

P3301 [SDOI2013]方程

题意:

在这里插入图片描述

题解:

插板法介绍

首先要先讲组合数学的一个方法:插板法

问题引出:把10个球放进三个盒子,每个箱子至少一个有多少种分法?

10个球就有9个空隙,我们可以考虑在这个9个空隙中放入两个隔板,这样10个球就被分成了3组,就相当于放入了三个箱子。
答案就是C10−13−1C_{10-1}^{3-1}C10131
也就是n个球放入m个盒子,每个箱子至少一个有Cn−1m−1C_{n-1}^{m-1}Cn1m1种分法

问题2:把10个球放进三个盒子有多少种分法

此时箱子内可以没有球,我们可以预先在3个盒子里都放一个球,则问题转化为将13个球放进3个盒子里,每个盒子至少一个有多少中放法。答案为C122C_{12}^2C122
也就是n个球放入m个盒子,有Cn+m−1m−1C_{n+m-1}^{m-1}Cn+m1m1种分法

本题讲解:

如果没有限制,就是求x1+x2+..+xn=Mx_{1}+x_{2}+..+x_{n}=Mx1+x2+..+xn=M,这不就相当于把M分配到n个箱子里,且每个箱子不能为空,这样答案就是CM−1n−1C_{M-1}^{n-1}CM1n1
但是题目有两类限制:

第二类限制为:Xi>=AiX_{i}>=A_{i}Xi>=Ai,我们可以巧妙的转化,对于第i个箱子要求分配数要大于AiA_{i}Ai,那我们可以认为先将Ai−1A_{i}-1Ai1分配给XiX_{i}Xi,然后剩下还是老分法(分配给n个箱子,每个箱子至少一个)。这种方法M要减去Ai−1A_{i}-1Ai1(相当于提前分配了)

对于第一类限制,Xi<=AiX_{i}<=A_{i}Xi<=Ai,就比较麻烦了,不过题目中限制数最大为8,我们可以用容斥解决
先计算不考虑前n1个数的限制方案数-前n1个数至少有一个不满足条件的方案数+前n1个数至少有2个不满足条件的方案数-…
代码具体就是枚举状态S,其二进制状态下,第i位为1表示计算了第i个数,如果有奇数个1就是减,偶数个1就是加
因为n,m很大,且p不一定为质数,所以用扩展卢卡斯
容斥代码:

for (int s= 0; s <= (1 << n1) - 1; s++) {int num= 0;ll now= m;for (int i= 1; i <= n1; i++) {if ((1 << (i - 1)) & s) {now-= a[i];num++;}}ll tmp= exLucas(now - 1, n - 1, mod);// printf("tmp=%lld\n",tmp);ans= (ans + ((num & 1) ? (mod - tmp) % mod : tmp)) % mod;}

这样做70分,会被卡常
题目所给的模数只有三种:
262203414=2∗3∗11∗397∗1007262203414=2*3*11*397*1007262203414=23113971007
437367875=53∗73∗1012437367875=5^3*7^3*101^2437367875=53731012
10007是质数10007是质数10007
这样可以省去扩展卢卡斯分析qk的过程,大大减少常数
同时优化一下扩展卢卡斯处理阶乘的过程,提前计算好,这样也可以大力卡常。不然根本卡不过去。

代码:

// Problem: P3301 [SDOI2013]方程
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3301
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Data:2021-08-27 16:25:48
// By Jozky#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...);
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef LOCALstartTime= clock();freopen("in.txt", "r", stdin);
#endif
}
void Time_test()
{
#ifdef LOCALendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
ll mod;void exgcd(ll a, ll b, ll& x, ll& y)
{if (!b) {x= 1, y= 0;return;}exgcd(b, a % b, y, x);y-= a / b * x;return;
}inline ll inv(ll n, ll p)
{ll x, y;exgcd(n, p, x, y);return (x + p) % p;
}ll qpow(ll base, ll p, ll mod)
{ll ret= 1;for (; p; p>>= 1, base= base * base % mod)if (p & 1)ret= ret * base % mod;return ret;
}ll CRT(int n, ll* a, ll* m)
{ll M= 1, ret= 0;for (ll i= 1; i <= n; i++)M*= m[i];for (ll i= 1; i <= n; i++) {ll w= M / m[i];ret= (ret + a[i] * w % mod * inv(w, m[i]) % mod) % mod;}return (ret + mod) % mod;
}
int retfac[10];
ll calc(ll n, ll q, ll qk,ll retfac)
{if (!n)return 1;ll ret= retfac;ret= qpow(ret, n / qk, qk);for (ll i= n / qk * qk + 1; i <= n; i++)if (i % q)ret= ret * (i % qk) % qk;return ret * calc(n / q, q, qk,retfac) % qk;
}ll multiLucas(ll n, ll m, ll q, ll qk,ll retfac)
{int cnt= 0;for (ll i= n; i; i/= q)cnt+= i / q;for (ll i= m; i; i/= q)cnt-= i / q;for (ll i= n - m; i; i/= q)cnt-= i / q;return qpow(q, cnt, qk) * calc(n, q, qk,retfac) % qk * inv(calc(m, q, qk,retfac), qk) % qk * inv(calc(n - m, q, qk,retfac), qk) % qk;
}int cnt;
ll qk[20];
ll qw[20];
ll exLucas(ll n, ll m, ll p)
{if(m>n)return 0;ll a[20];
//    int cnt= 0;
//    ll qk[20], a[20]; //存放所有的 q^k 和待合并答案的结果
//    
//    for (ll i= 2; i * i <= p; ++i) //质因数分解
//    {
//        if (p % i == 0) {
//            qk[++cnt]= 1;
//            while (p % i == 0)
//                qk[cnt]*= i, p/= i;
//            a[cnt]= multiLucas(n, m, i, qk[cnt]);
//        }
//    }
//    if (p > 1)
//        qk[++cnt]= p, a[cnt]= multiLucas(n, m, p, p);for(int i=1;i<=cnt;i++){a[i]=multiLucas(n, m,qw[i] , qk[i],retfac[i]);}return CRT(cnt, a, qk); //CRT 合并答案
}
void init(ll p) {for (ll i= 2; i * i <= p; ++i) //质因数分解{if (p % i == 0) {qk[++cnt]= 1;qw[cnt]=i;while (p % i == 0)qk[cnt]*= i, p/= i;}}if (p > 1)qk[++cnt]= p,qw[cnt]=p;for(int i=1;i<=cnt;i++){retfac[i]=1;for(int j=1;j<=qk[i];j++){if(j%qw[i]){retfac[i] = 1ll * retfac[i] * j % qk[i];}}}
}ll t;
const int maxn= 10;
int a[maxn], b[maxn];
ll n, n1, n2, m;
void init(){} 
int main()
{//rd_test();read(t, mod);init(mod);//预处理,不然会t三个点 while (t--) {read(n, n1, n2, m);for (int i= 1; i <= n1; i++)read(a[i]);for (int i= 1; i <= n2; i++) {read(b[i]);m-= (b[i] - 1);}//ll sum=exLucas(m-1,n-1,mod);ll ans= 0;for (int s= 0; s <= (1 << n1) - 1; s++) {int num= 0;ll now= m;for (int i= 1; i <= n1; i++) {if ((1 << (i - 1)) & s) {now-= a[i];num++;}}ll tmp= exLucas(now - 1, n - 1, mod);// printf("tmp=%lld\n",tmp);ans= (ans + ((num & 1) ? (mod - tmp) % mod : tmp)) % mod;}printf("%lld\n", ans);}return 0;//Time_test();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Framework 4.8发布

原文地址&#xff1a;https://devblogs.microsoft.com/dotnet/announcing-the-net-framework-4-8/我们很高兴地宣布今天发布.NET Framework 4.8。它包含在Windows 10 May 2019更新中。.NET Framework 4.8也可在Windows 7和Windows Server 2008 R2 上使用。您可以从我们的 .NET下…

[NewLife.XCode]数据层缓存(网站性能翻10倍)

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netcore&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代…

[NewLife.XCode]高级查询(化繁为简、分页提升性能)

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netcore&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代…

微软云Azure训练营 | 八城联动,全球盛会

Global Azure Bootcamp是由微软发起、MVP参与组织的全球化学习交流活动。每年会挑选一个特定的时间&#xff0c;在同一天内&#xff0c;全球不同地区将同时开展。2019年全球Azure训练营&#xff08;Global Azure Bootcamp&#xff09;将于2019年4月27日在全球270多个城市同时举…

长沙4月21日开发者大会暨.NET社区成立大会活动纪实

活动总结2019年4月21日是一个斜风细雨、微风和煦的美好日子&#xff0c;由长沙.NET技术社区、腾讯云云加社区、微软Azure云技术社区、中国.NET技术社区、长沙柳枝行动、长沙互联网活动基地&#xff08;唐胡子俱乐部&#xff09;等多家单位共同主办的长沙开发者技术大会暨长沙.N…

SQL Server AlwaysOn 集群 关于主Server IP与Listener IP调换的详细测试

1. 背景SQL Server 搭建AlwaysOn后&#xff0c;我们就希望程序连接时使用虚拟的侦听IP&#xff08;Listener IP&#xff09;&#xff0c;而不再是主Server 的IP。如果我们有采用中间件&#xff0c;则可以在配置中&#xff0c;直接用Listener IP 替换掉 Server IP&#xff0c;可…

在 DotNetCore 3.0 程序中使用通用协议方式启动文件关联应用

问题描述在传统的基于 .NET Framework 的 WPF 程序中&#xff0c;我们可以使用如下代码段启动相关的默认应用&#xff1a;Copy# 启动默认文本编辑器打开 helloworld.txtProcess.Start("helloworld.txt");# 启动默认浏览器打开 https:Process.Start("https://hip…

.NetCoreLinuxDockerPortainer踩坑历险记

最近有一个云服务器和数据库的迁移任务&#xff0c;踩坑爬坑无数次&#xff0c;觉得必须要记录一下。大家瓜子花生准备好&#xff0c;听我慢慢讲故事#手动笑哭#。故事背景公司是做电商业务的&#xff0c;在天猫有几家旗舰店数据量也很大。阿里有一个称为聚石塔的平台&#xff0…

深入源码理解.NET Core中Startup的注册及运行

开发.NET Core应用&#xff0c;直接映入眼帘的就是Startup类和Program类&#xff0c;它们是.NET Core应用程序的起点。通过使用Startup&#xff0c;可以配置化处理所有向应用程序所做的请求的管道&#xff0c;同时也可以减少.NET应用程序对单一服务器的依赖性&#xff0c;使我们…

Python、Java、TypeScript 和 Perl 作者谈语言设计

Python 作者 Guido van Rossum、Java 作者 James Gosling、Turbo Pascal 和 TypeScript 作者 Anders Hejlsberg&#xff0c;以及 Perl 作者 Larry Wall 本月早些时候齐聚一堂&#xff0c;讨论了(YouTube)编程语言设计的过去和未来。Guido van Rossum 说&#xff0c;设计一种语言…

Asp.Net Core Web应用程序—探索

前言作为一个Windows系统下的开发者&#xff0c;我对于Core的使用机会几乎为0&#xff0c;但是考虑到微软的战略规划&#xff0c;我觉得&#xff0c;Core还是有先了解起来的必要。因为&#xff0c;目前微软已经搞出了两个框架了&#xff0c;一个是Net标准(.NetFramework)&#…

智能优化算法应用:基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.跳蛛算法4.实验参数设定5.算法结果6.参考文献7.MA…

让你的ASP.NET Core应用程序更安全

对于ASP.NET Core应用程序&#xff0c;除了提供认证和授权机制来保证服务的安全性&#xff0c;还需要考虑下面的一些安全因素&#xff1a;CSRF强制HTTPS安全的HTTP HeadersCSRFASP.NET Core通过AntiForgeryToken来阻止CSRF攻击&#xff0c;一般来说&#xff0c;当用户做表单提交…

.net core 中间件管道底层剖析

.net core 管道&#xff08;Pipeline&#xff09;是什么&#xff1f;由上图可以看出&#xff0c;.net core 管道是请求抵达服务器到响应结果返回的中间的一系列的处理过程&#xff0c;如果我们简化一下成下图来看的话&#xff0c;.net core 的管道其实就是中间件的部分。微软中…

架构为什么要以领域为核心

很久以前, 人们以为地球是太阳系的中心.然后一位聪明人, 哥白尼, 他改变了我们对太阳系的看法. 他认为太阳是太阳系的中心:这是对太阳更好的一个解释, 更简单也更具说服力. 事实上, 以太阳为中心的模型确实是更优雅的.上面这件事也发生在软件开发里. 下面这个就是很多开发者惯用…

201403-5 任务调度

哇&#xff0c;ccf csp认证考试 历年真题解&#xff08;一本书&#xff09;真厉害。 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring>using namespace std;typedef long long LL; typedef pair<int,int> PII; con…

C# - 为引用类型重定义相等性 - 继承相关

派生类这是上面Citizen类的一个子类&#xff1a;下面我重写object.Equals() 方法&#xff1a;大部分逻辑都在base.Equals()方法里了&#xff0c;首先如果父类的Equals()方法返回false&#xff0c;那么下面也就不用做啥了。但是如果父类Equals()认为这两个实例是相等的&#xff…

微软百名员工签名力挺996.ICU

中国程序员上传到 GitHub 的 996.ICU repo 火速在互联网广泛传播时&#xff0c;996 工作制引起了全球的广泛关注&#xff0c;Python 之父直指这是不人道的行为&#xff0c;事情经过不断发酵&#xff0c;中国官方媒体也接连发声表态要警惕「996 工作制」。就在今日&#xff0c;微…

P1174 打砖块

P1174 打砖块 题意&#xff1a; 题解&#xff1a; 参考题解&#xff1a; I_AM_HelloWord danxmz2006 这两个博客结合看&#xff0c;大致就能理解 我们只在N处转移&#xff0c;面对Y类的块无需决策&#xff0c;因为Y类的块可以一直打 不同的打砖块的顺序&#xff0c;决定了我…

包治百病 | 如何将一个.NET Core类库发布到NuGet

点击上方蓝字关注“汪宇杰博客”NuGet是.NET世界的包管理器&#xff0c;有官方的nuget.org&#xff0c;也允许构建公司和私人的服务器。在.NET Core的时代&#xff0c;封装一个NuGet包比以往更容易&#xff0c;我们来看看吧&#xff01;NuGet账号如果你想和微软一起予力众生&am…