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,一经查实,立即删除!

相关文章

201912-3 化学方程式

他这个好像之和大写字母有关系&#xff1b; 小写字母跟着前面的的大写字母&#xff1b; 和代表要处理了&#xff1b; &#xff08;&#xff09;代表要乘了&#xff1b; #include<iostream> #include<cstdio> #include<algorithm> #include<cstring>…

.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下…

Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 + Div. 2)

Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 Div. 2) 题号题目知识点AA Variety of OperationsBTake Your Places!CCompressed Bracket SequenceDTake a GuessEEquilibriumFSports BettingGGates to Another WorldHDIY Tree

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

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

cf1556A. A Variety of Operations

cf1556A. A Variety of Operations 题意&#xff1a; 有两个数a&#xff0c;b一开始都是0&#xff0c;现在有三种操作&#xff1a; 给a和b都加ka加k&#xff0c;b减ka减k&#xff0c;b加k 问从a0&#xff0c;b0到ac&#xff0c;bd最少需要几步&#xff1f; 题解&#xff1a…

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

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

cf1556B B. Take Your Places!

cf1556B B. Take Your Places! 题意&#xff1a; 有n个数&#xff0c;你可以将相邻两个数交换&#xff0c;使得奇偶性一样的数不相邻。问最少操作步数 题解&#xff1a; 最终排列无非是&#xff1a;奇&#xff0c;偶&#xff0c;奇…或者偶&#xff0c;奇&#xff0c;偶… …

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

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

2021-09-211547G - How Many Paths?

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <set> using namespace std; typedef long long ll;const int N4e510,M1e610,mod998244353;int h[N],hs[N],e[M],ne[M],idx0; // h 原图 hs新图 v…

cf1556Compressed Bracket Sequence

cf1556Compressed Bracket Sequencex 题意&#xff1a; 给你n个数&#xff0c;奇数位置上的数表示左括号的数量&#xff0c;偶数位置上的数表示右括号的数量。问有多少个[l,r]是满足括号匹配的 题解&#xff1a; 括号匹配也算是经典问题了 直接统计不好计算&#xff0c;我们…

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

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

树上启发式合并 简单例题

U41492 树上数颜色 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <set> #include <vector> #include <queue> using namespace std; typedef long long LL; typedef pair<int,int…

cf1556D. Take a Guess

cf1556D. Take a Guess 题意&#xff1a; 交互题 有n个数和k个询问&#xff0c;你最多只能询问2n次&#xff0c;可以询问任意两个位置数的or或者是and&#xff0c;然后输出这n个数的第k大数 题解&#xff1a; 先说个结论&#xff1a; x y (x or y) (x and y) (嘶&#x…

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;可…

1592E - Скучающий Бакри

首先把那式子转换成长度为偶数并且二进制有一段连续的一&#xff0c;大于这位的数量都是偶数 如果长度为奇数那么如果 and 是1&#xff0c;xor 一定是1&#xff1b;and 是0&#xff0c;xor可能是1&#xff1b;所以长度为奇数一定不可以。 那么长度为偶数的话&#xff0c;对二…

cf1556E. Equilibrium

cf1556E. Equilibrium 题意&#xff1a; 有a&#xff0c;b两组长度为n的数&#xff0c;现在你要通过操作将范围[l,r]中的a&#xff0c;b两组一样。每次操作你在[l,r]中选偶数个下标pos&#xff0c;{pos1,pos2,pos3…}&#xff0c;在奇数位上的下标给序列a对应的下标pos1加上1…

线段树动态开点 - - - > 线段树合并

逆序对 代码 P3224 [HNOI2012]永无乡 并查集线段树合并 ​​​​ 代码 P5494 【模板】线段树分裂 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<queue> #include<…

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

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

cf451E. Devu and Flowers(产生不同多重集数量)

cf451E. Devu and Flowers 题意&#xff1a; 有n个箱子&#xff0c;第i个箱子里有ai朵花&#xff0c;同一个箱子里花的颜色一样&#xff0c;不同箱子里的花颜色不一样。现在在这些箱子里选出m朵花组成一束&#xff0c;求一共有多少种方案。要求任意两束花都不一样 题解&…

.NetCoreLinuxDockerPortainer踩坑历险记

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