Bzoj2655 calc

Time Limit: 30 Sec  Memory Limit: 512 MB
Submit: 255  Solved: 162

Description

  一个序列a1,...,an是合法的,当且仅当:
  长度为给定的n。
  a1,...,an都是[1,A]中的整数。
  a1,...,an互不相等。
  一个序列的值定义为它里面所有数的乘积,即a1a2...an。
  求所有不同合法序列的值的和。
  两个序列不同当且仅当他们任意一位不一样。
  输出答案对一个数mod取余的结果。

Input

  一行3个数,A,n,mod。意义为上面所说的。

Output

  一行结果。

Sample Input

9 7 10007

Sample Output

3611

HINT

数据规模和约定

  0:A<=10,n<=10。

  1..3:A<=1000,n<=20.

  4..9:A<=10^9,n<=20

  10..19:A<=10^9,n<=500。

  全部:mod<=10^9,并且mod为素数,mod>A>n+1

Source

数学问题 伯努利数 容斥 脑洞题

设$ f[i] $表示长度为i的合法序列,$ g[i]=\sum{j=1}^{A} j^i $

然后容斥一下:

$ f[i]=g[i]*f[i-1] - C_{i-1}^{1}*(2-1)!*g[2]*f[i-2]+ C_{i-1}^{2}*(3-1)!*g[3]*f[i-3] - ...$

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 #define LL long long
 7 using namespace std;
 8 const int mxn=511;
 9 int read(){
10     int x=0,f=1;char ch=getchar();
11     while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
12     while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
13     return x*f;
14 }
15 int A,n,mod;
16 int c[mxn][mxn],inv[mxn],fac[mxn];
17 LL B[mxn],g[mxn],f[mxn];
18 void init(){
19     int i,j;
20     int mxn=n+2;
21     for(i=0;i<mxn;i++)c[i][0]=1;
22     for(i=1;i<mxn;i++)
23         for(j=1;j<mxn;j++)
24             c[i][j]=((LL)c[i-1][j-1]+c[i-1][j])%mod;
25     inv[0]=inv[1]=1;fac[0]=fac[1]=1;
26     for(i=2;i<mxn;i++){
27         inv[i]=((-mod/i*(LL)inv[mod%i]%mod)+mod)%mod;
28         fac[i]=(LL)fac[i-1]*i%mod;
29     }
30     B[0]=1;
31     for(i=1;i<mxn;i++){
32         for(j=0;j<i;j++)
33             B[i]=(B[i]-c[i+1][j]*B[j])%mod;
34         B[i]=B[i]*inv[i+1]%mod;
35         if(B[i]<0)B[i]+=mod;
36     }
37     return;
38 }
39 void solve(){
40     int i,j,k;
41     for(k=1;k<=n;k++){
42         int tmp=A+1,bas=tmp;
43         for(i=1;i<=k+1;i++){
44             g[k]=g[k]+c[k+1][i]*B[k+1-i]%mod*tmp%mod;
45             if(g[k]>=mod)g[k]-=mod;
46             tmp=(LL)tmp*bas%mod;
47         }
48         g[k]=g[k]*inv[k+1]%mod;
49     }
50     f[0]=1;
51     for(i=1;i<=n;i++){
52         LL F=1;
53         for(j=1;j<=i;j++){
54             f[i]=(f[i]+F*g[j]*c[i-1][j-1]%mod*f[i-j]%mod*fac[j-1])%mod;
55             F=-F;
56         }
57     }
58     printf("%lld\n",(f[n]+mod)%mod);
59     return;
60 }
61 int main(){
62     int i,j;
63     A=read();n=read();mod=read();
64     init();
65     solve();
66     return 0;
67 }
时间: 2024-10-09 17:52:14

Bzoj2655 calc的相关文章

bzoj千题计划269:bzoj2655: calc

http://www.lydsy.com/JudgeOnline/problem.php?id=2655 f[i][j] 表示[1,i]里选严格递增的j个数,序列值之和 那么ans=f[A][n] *  n! A太大,那么用拉格朗日插值法 f[i][j] 是关于i的2j次多项式,证明如下: %%%rqy #include<cstdio> using namespace std; int mod; int f[1510][501]; int x[1005],y[1005],tot; int Po

【BZOJ】2655: calc 动态规划+拉格朗日插值

[题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1<A<mod<=10^9,mod是素数. [算法]动态规划+拉格朗日插值 [题解]这道题每个数字的贡献和序列选了的数字积关系密切,所以不能从序列角度考虑(和具体数字关系不大). 设$f_{n,m}$表示前n个数字(值域)中取m个数字的答案,那么枚举取或不取数字n,取n时乘n且有j个位置可以插入,即:

calc()

代替怪异盒模型.box-sizing:border_box; 什么是calc()? 学习calc()之前,我们有必要先知道calc()是什么?只有知道了他是个什么东东?在实际运用中更好的使用他. calc()从字面我们可以把他理解为一个函数function.其实calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,用来指定元素的长度.比如说,你可以使用calc()给元素的border.margin.pading.font-size和width等属性设置动态值.为何说是动

css3 calc():css简单的数学运算-加减乘除

css3 calc():css简单的数学运算–加减乘除 多好的东西啊,不用js,一个css就解决了. .box{ border:1px solid #ddd; width:calc(100% - 100px); background:#9AC8EB; } 3栏等宽布局 .box{ margin-left:20px; width:calc(100%/3 - 20px); } .box:nth-child(3n){ margin-left:0; } 运算规则 calc()使用通用的数学运算规则,但是

css3案例之calc()的使用

calc()是个什么鬼?相信对css3研究比较深入的童鞋对这个函数的作用及用法还是比较熟悉,对于web前端新人而言,这个函数还是比较陌生.其实calc()是css3的一个新增功能,用来指定元素的长度,我们也可以把它理解为一个函数的function.今天小编就和大家分享一下CSS3的calc()的作用及具体用法. calc()能做什么? CSS3中calc()具体有什么用处呢? calc()不仅可以给元素的border.margin.pading.font-size和width等属性设置动态值,在

calc(NOIP模拟赛Round 3)

原题: D e s c r i p t i o n 给三个正整数n,m和p,求(n^1+...n^m) mod p. Input 一行,三个整数n,m和p. Output 输出答案. S a m p l e  I n p u t 2 2 5 S a m p l e  O u t p u t 1 数 据 范 围 n,p<=10^8    m<=10^17 时 限 1s 首先看到m范围就知道是快速幂了对吧. 然后我们想想看.假如是平常的快速幂的话时间复杂度为O(M) TLE了对吧,然后我们想想有没

计算(calc.cpp)x 这题我搞了2晚上qwq

终于会了!可喜可贺!可喜可贺! 计算(calc.cpp) [问题描述] 小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有"(",")","0-9","+","-","*","/","^"求出的值就是密码.小明数学学得不好,还需你帮他的忙.("/"用整数除法) [输入]

calc()使用笔记

calc()可以给元素做运算, calc(expression) eg: .a { width: -webkit-calc(100% - 2px); width: -moz-calc(100% - 2px); width: calc(100% - 2px); } 语法: 1.可以使用+ - * %()等运算符 2.可以使用百分比,px,em,rem计算其css属性 3.+ - 运算符前后必须有空格,* %可以没有,但为了保持一致性最好也加上 4.写时得考虑兼容性 兼容性: IE9+.FF4.0+

CSS3的calc()使用

转自:http://www.w3cplus.com/css3/how-to-use-css3-calc-function.html calc()对大家来说,或许很陌生,不太会相信calc()是css中的部分.因为看其外表像个函数,既然是函数为何又出现在CSS中呢?这一点 也让我百思不得其解,今天有一同事告诉我,说CSS3中有一个属性能实现自适应的布局,首先让我想到的是box-sizing,但跟我说还可以计算,这让 我不得不想起calc().因为早先在官网和一些blog上看到相关的介绍,但一直没有