【拓展卢卡斯】LuoGu P2183 [国家集训队]礼物

这是一道CTSC水题

题目描述

一年一度的圣诞节快要来到了。每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物。不同的人物在小E心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多。小E从商店中购买了n件礼物,打算送给m个人,其中送给第i个人礼物数量为wi。请你帮忙计算出送礼物的方案数(两个方案被认为是不同的,当且仅当存在某个人在这两种方案中收到的礼物不同)。由于方案数可能会很大,你只需要输出模P后的结果。

输入输出格式

输入格式:

输入的第一行包含一个正整数P,表示模;

第二行包含两个整整数n和m,分别表示小E从商店购买的礼物数和接受礼物的人数;

以下m行每行仅包含一个正整数wi,表示小E要送给第i个人的礼物数量。

输出格式:

若不存在可行方案,则输出“Impossible”,否则输出一个整数,表示模P后的方案数。

输入输出样例

输入样例#1: 复制

100
4 2
1
2

输出样例#1: 复制

12

输入样例#2: 复制

100
2 2
1
2

输出样例#2: 复制

Impossible

说明

【样例说明】

下面是对样例1的说明。

以“/”分割,“/”前后分别表示送给第一个人和第二个人的礼物编号。12种方案详情如下:

1/23 1/24 1/34

2/13 2/14 2/34

3/12 3/14 3/24

4/12 4/13 4/23

设P=p1^c1 * p2^c2 * p3^c3 * … *pt ^ ct,pi为质数。

对于15%的数据,n≤15,m≤5,pi^ci≤10^5;

在剩下的85%数据中,约有60%的数据满足t≤2,ci=1,pi≤10^5,约有30%的数据满足pi≤200。

对于100%的数据,1≤n≤10^9,1≤m≤5,1≤pi^ci≤10^5,1≤P≤10^9。

这个思路真的是很水很水很水

思路学过组合数的都能想出来,这道题主要就是要会exlucas,可以看我的博客点这里

唯一注意的就是不要手残,不写函数名,用一个括号括上几个变量,因为这样不会CE但是得调试半天(我真是瞎了QAQ)

上代码!

  1 #include<cstdio>
  2 #include<algorithm>
  3 #define lt long long
  4 #define rt register lt
  5 #define il inline
  6 using namespace std;
  7 lt p,n,m,w,tot,ans=1;
  8 namespace misaki
  9 {
 10     il lt gcd(lt a,lt b){return b?gcd(b,a%b):a;}
 11     il lt lcm(lt a,lt b){return a/gcd(a,b)*b;}
 12     il lt ksc(lt a,lt b,lt mod)
 13     {
 14         if(a==0||b==0)return 0;
 15         lt fina=0,kk=1;
 16         if(a<0)a=-a,kk=-kk;
 17         if(b<0)b=-b,kk=-kk;
 18         while(b)
 19         {
 20             if(b%2)fina=(fina+a)%mod;
 21             b>>=1,a=(a+a)%mod;
 22         }
 23         return fina%mod*kk;
 24     }
 25     il lt ksm(lt a,lt k,lt mod)
 26     {
 27         if(!k)return 1;
 28         lt fina=1;
 29         while(k)
 30         {
 31             if(k%2)fina=ksc(fina,a,mod);
 32             k>>=1,a=(a*a)%mod;
 33         }
 34         return fina%mod;
 35     }
 36     il void ex_gcd(lt a,lt b,lt &x,lt &y)
 37     {
 38         if(!b)x=1,y=0;
 39         else
 40         {
 41             ex_gcd(b,a%b,x,y);
 42             lt tt=x;x=y,y=tt-a/b*x;
 43         }
 44     }
 45     il lt exgcd(lt a,lt b,lt c)
 46     {
 47         lt gc=gcd(a,b),x=0,y=0;
 48         if(c%gc){    printf("aaa");return -1;}
 49         a/gc,b/=gc,c/=gc;
 50         ex_gcd(a,b,x,y);
 51         return (x*c%b+b)%b;
 52     }
 53     il lt inv(lt a,lt p)
 54     {
 55         if(!a)return 0;
 56         return exgcd(a,p,1);
 57     }
 58 }
 59 namespace lucas
 60 {
 61     using namespace misaki;
 62     il lt fac(const lt n,const lt pi,const lt pk)//n!%p^k
 63     {
 64         if(n==1||n==0)return 1;
 65         lt ans=1;
 66         for(rt i=2;i<pk;i++)
 67             if(i%pi)ans=ans*i%pk;
 68         ans=ksm(ans,n/pk,pk);
 69         for(rt i=2;i<=n%pk;i++)
 70             if(i%pi)ans=ans*i%pk;
 71         return ksc(ans,fac(n/pi,pi,pk),pk);
 72     }
 73     il lt C(const lt n,const lt m,const lt pi,const lt pk)//C(n,m)%p^k
 74     {
 75         lt up=fac(n,pi,pk),dl=fac(m,pi,pk),dr=fac(n-m,pi,pk),sum=0;
 76         for(rt i=n;i;i/=pi)sum+=i/pi;
 77         for(rt i=m;i;i/=pi)sum-=i/pi;
 78         for(rt i=n-m;i;i/=pi)sum-=i/pi;
 79         return up*inv(dl,pk)%pk*inv(dr,pk)%pk*ksm(pi,sum,pk)%pk;
 80     }
 81     il lt exlucas(const lt n,const lt m,const lt P)
 82     {
 83         lt tt=P,ans=0;
 84         for(rt i=2;i<=tt;i++)
 85             if(tt%i==0)
 86             {
 87                 lt pi=i,pk=1;
 88                 while(!(tt%i))tt/=i,pk*=i;
 89                 ans=(ans+C(n,m,pi,pk)*(P/pk)%P*inv(P/pk,pk)%P)%P;
 90             }
 91         return ans%P;
 92     }
 93 }
 94 int main()
 95 {
 96     scanf("%lld%lld%lld",&p,&n,&m);bool fl=0;
 97     for(rt i=1;i<=m;i++)
 98     {
 99         scanf("%lld",&w);
100         if(n<w){fl=1;break;}tot+=w,ans=(ans*lucas::exlucas(n,w,p))%p,n-=w;
101     }
102     if(fl)puts("Impossible");
103     else printf("%lld",ans);
104     return 0;
105 }

原文地址:https://www.cnblogs.com/Qin-Wei-Kai/p/10104831.html

时间: 2024-11-09 10:02:04

【拓展卢卡斯】LuoGu P2183 [国家集训队]礼物的相关文章

【luogu P1494 [国家集训队]小Z的袜子】 题解

题目链接:https://www.luogu.org/problemnew/show/P1494 #include <cstdio> #include <algorithm> #include <iostream> #include <cmath> using namespace std; const int maxn = 50000+10; inline long long read() { long long k=0; char c; c=getchar

题解:luogu P2634 [国家集训队]聪聪可可

题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏. 他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个"点",并用n-1条"边"把这n个"点"恰好连通(其实这就是一棵树).并且每条"边"上都有一个数.接下来由聪聪和可可分别随即选

LUOGU P1505 [国家集训队]旅游 (树链剖分+线段树)

传送门 解题思路 快被调死的码农题,,,其实就是一个边权下放到点权的线段树+树剖. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> using namespace std; const int MAXN = 100005; const int inf = 0x3f3f3f3f; inline int rd(){

LUOGU P1407 [国家集训队]稳定婚姻

传送门 解题思路 让所有夫妇之间连男到女的边,所有情人之间连女到男的边,然后用$tarjan$,如果对于一对夫妻在强连通分量里,那么就是不稳定的,因为他们可以绕一圈. #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<map> using namespace std; const int MAXN = 8005; const int MA

【资料】国家集训队论文集(1999~2014)

本文版权归ACShiryu和acvay所有,如转载请注明原作者. 国家集训队1999论文集 1.陈宏:<数据结构的选择与算法效率--从IOI98试题PICTURE谈起> 2.来煜坤:<把握本质,灵活运用--动态规划的深入探讨> 3.齐鑫:<搜索方法中的剪枝优化> 4.邵铮:<数学模型的建立.比较和应用> 5.石润婷:<隐蔽化.多维化.开放化--论当今信息学竞赛中数学建模的灵活性> 6.杨帆:<准确性.全面性.美观性--测试数据设计中的三要素

国家集训队2011 happiness

[试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值.作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大. [输入格式] 第一行两个正整数n,m.接下来是六个矩阵第一个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学

[国家集训队2010]小Z的袜子

★★★   输入文件:hose.in   输出文件:hose.out   简单对比 时间限制:1 s   内存限制:512 MB [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便

BZOJ 2038: [2009国家集训队]小Z的袜子(hose)

2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只

[补档][国家集训队2011]单选错位

题目 gx和lc去参加noip初赛,其中有一种题型叫单项选择题,顾名思义,只有一个选项是正确答案. 试卷上共有n道单选题,第i道单选题有ai个选项,这ai个选项编号是1,2,3,-,ai,每个选项成为正确答案的概率都是相等的.lc采取的策略是每道题目随机写上1-ai的某个数作为答案选项,他用不了多少时间就能期望做对sigma(1/ai)道题目.gx则是认认真真地做完了这n道题目,可是等他做完的时候时间也所剩无几了,于是他匆忙地把答案抄到答题纸上,没想到抄错位了:第i道题目的答案抄到了答题纸上的第