bzoj1436: Poi2003 Trinomial

来源:互联网 发布:数据分析主要分析哪些 编辑:程序博客网 时间:2024/05/17 07:03

传送门
神题啊。
答案=C(n*2,m)*(m mod 2+1) mod 3.
证明挖坑。

update:来填坑啦
根据答案我们可以推断求解过程
首先我们又相邻的两个位置来表示一个多项式中到底是乘1,x,x^2
在两个数中取y个表示当前项乘的是x^y
显然这样我们可以所有合法解,总共C(n*2,m)种
但是会有重复情况。
因为我们枚举1的时候会将其计算两次
我们考虑去重。
首先我们假设有z个位置乘x
我们可以发现z,m一定奇偶性相同。
同时我们发现,2^奇数 mod 3=2,2^偶数次 mod 3=1
所以每种方案的重复次数在mod3意义下是同余的。
答案就是C(n*2,m)*inv(2^(m%2)) mod 3
又因为inv(1)=1,inv(2)=2
所以答案就是C(n*2,m)*2^(m%2) mod 3
然后后面的东西等价于(m%2+1)
于是我们就证明了这个公式。

#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define ll long longusing namespace std;int c[5][5],T;ll n,m;int C(ll x,ll y){    if (!x&&!y) return 1;    return c[x%3][y%3]*C(x/3,y/3)%3;}int main(){    c[0][0]=1; c[1][0]=1; c[1][1]=1;    c[2][0]=1; c[2][1]=2; c[2][2]=1;    scanf("%d",&T);    for (int i=1;i<=T;i++){        scanf("%lld %lld",&n,&m);        printf("%d\n",C(n*2,m)*(m%2+1)%3);    }}
原创粉丝点击