记录编号 449345 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2011]礼物(魏铭) 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 0.045 s
提交时间 2017-09-14 07:52:39 内存使用 7.92 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. typedef long long ll;
  5. int power(int x,int y,int p){
  6. int ans=1;
  7. for (;y;y>>=1,x=1ll*x*x%p)
  8. if (y&1) ans=1ll*ans*x%p;
  9. return ans;
  10. }
  11. int getpow(int x,int p){
  12. return x>=p?getpow(x/p,p)+x/p:0;
  13. }
  14. int n,m,p,cnt,prime[20],pow[20];
  15. void factor(int p){
  16. for (int i=2;i*i<=p;i++)
  17. if (p%i==0){
  18. prime[++cnt]=i;
  19. while (p%i==0) pow[cnt]++,p/=i;
  20. }
  21. if (p>1) prime[++cnt]=p,pow[cnt]=1;
  22. }
  23. const int N=1e5+10;
  24. struct _mod{
  25. int jc[N],p,mod;
  26. void init(int P,int Mod){
  27. p=P;mod=Mod;
  28. jc[0]=1;
  29. for (int i=1;i<mod;i++) jc[i]=1ll*jc[i-1]*(i%p?i:1)%mod;
  30. }
  31. int calc(int n){//求n!%mod
  32. return n>=p?1ll*jc[n%mod]*power(jc[mod-1],n/mod,mod)%mod*calc(n/p)%mod:jc[n];
  33. }
  34. }base[20];
  35. int mi[20],res[20],mod[20],phi[20];
  36. void del(int x){
  37. for (int i=1;i<=cnt;i++){
  38. int r=base[i].calc(x);
  39. mi[i]-=getpow(x,prime[i]);
  40. res[i]=1ll*res[i]*power(r,phi[i]-1,mod[i])%mod[i];
  41. }
  42. }
  43. int main()
  44. {
  45. freopen("nt2011_gift.in","r",stdin);
  46. freopen("nt2011_gift.out","w",stdout);
  47. scanf("%d%d%d",&p,&n,&m);
  48. factor(p);
  49. for (int i=1;i<=cnt;i++){
  50. mod[i]=1;
  51. for (int j=0;j<pow[i];j++) mod[i]*=prime[i];
  52. phi[i]=mod[i]/prime[i]*(prime[i]-1);
  53. base[i].init(prime[i],mod[i]);
  54. mi[i]=getpow(n,prime[i]);
  55. res[i]=base[i].calc(n);
  56. }
  57. ll sum=0;
  58. for (int i=1;i<=m;i++){
  59. int x;
  60. scanf("%d",&x);
  61. sum+=x;del(x);
  62. }
  63. if (n<sum) return puts("Impossible"),0;
  64. del(n-sum);
  65. ll ans=0;
  66. for (int i=1;i<=cnt;i++){
  67. res[i]=1ll*res[i]*power(prime[i],mi[i],mod[i])%mod[i];
  68. int P=p/mod[i];
  69. ans=(ans+1ll*res[i]*P*power(P,phi[i]-1,mod[i]))%p;
  70. }
  71. printf("%lld\n",ans);
  72. return 0;
  73. }