【BZOJ】1436: Poi2003 Trinomial
2015-11-22 13:22
246 查看
题意
\(q(1 \le q \le 10000)\)次询问,每一次求\((x^2+x+1)^n\)的第\(k\)项系数模3。分析
听说正解是\(\binom{2n}{m} (m \% 2+1)\),表示不会。我来一个说一个我yy出来的玄学做法
\[ (x^2+x+1)^n = \sum_{i=0}^{n} \binom{n}{i} \sum_{j=0}^{i} \binom{i}{j} x^{i+j} \]
第\(k\)项的系数就是\(\sum_{i=0}^{k} \binom{n}{i} \binom{i}{k-i} \mod \ 3\)
$$\begin{align} & \sum_{i=0}^{k} \binom{n}{i} \binom{i}{k-i} \mod \ 3 \\= & \sum_{j=0}^{2} \sum_{i=0}^{\left \lfloor \frac{k-j}{3} \right \rfloor} \binom{n \% 3}{(3i+j) \% 3} \binom{\left \lfloor \frac{n}{3} \right \rfloor}{\left \lfloor \frac{3i+j}{3} \right \rfloor} \binom{(3i+j) \% 3}{(k-(3i+j)) \% 3} \binom{\left \lfloor \frac{3i+j}{3} \right \rfloor}{\left \lfloor \frac{k-(3i+j)}{3} \right \rfloor} \mod \ 3 \\= & \sum_{j=0}^{2} \binom{n \% 3}{j} \binom{j}{(k-j) \% 3} \sum_{i=0}^{\left \lfloor \frac{k-j}{3} \right \rfloor} \binom{\left \lfloor \frac{n}{3} \right \rfloor}{i} \binom{i}{\left \lfloor \frac{k-j}{3} \right \rfloor-i} \mod \ 3\\\end{align}$$
然后变成3个子问题,由于可以根据\(\binom{n%3}{j} \binom{j}{(k-j)%3}\)是否为\(0\)还有\(\left \lfloor \frac{k-1}{3} \right \rfloor == \left \lfloor \frac{k-2}{3} \right \rfloor\)之类的强力减枝,所以很快。
虽然理论复杂度是单次查询\(O(k)\)的,不过最后我还是过了= =很快= =
复杂度属于玄学。
题解
分析里说得很清楚了。#include <bits/stdc++.h> using namespace std; typedef long long ll; int C(int n, int m) { return n<m?0:(n==0?1:(n==1?1:(m==1?2:1))); } int lucas(ll n, ll m) { return m==0?1:(m==1?n%3:(n%3*((n-1)%3)*2%3)); } int f(ll n, ll k) { if(k<=2) { int ans=0; for(int i=0; i<=k; ++i) { ans+=lucas(n, i)*lucas(i, k-i); } return ans%3; } int t1=C(n%3, 0)*C(0, (k-0)%3)%3, nx1=t1==0?0:f(n/3, (k-0)/3), t2=C(n%3, 1)*C(1, (k-1)%3)%3, nx2=t2==0?0:((t1&&(k%3>0))?nx1:f(n/3, (k-1)/3)), t3=C(n%3, 2)*C(2, (k-2)%3)%3, nx3=t3==0?0:((t2&&(k%3>1))?nx2:f(n/3, (k-2)/3)); return (t1*nx1+t2*nx2+t3*nx3)%3; } ll n, k; int main() { int T; scanf("%d", &T); while(T--) { scanf("%lld%lld", &n, &k); printf("%d\n", f(n, k)); } return 0; }
相关文章推荐
- Android学习手记(4) BroadcastReceiver监听电池信息
- 设计一个优秀的工程框架-纯个人思想
- 顺序表之迷宫问题(C实现)
- 问题1 String类和Object类中的equals方法比较
- 冒泡排序
- ubuntu14.04切换root用户
- 实现m*n型数列相加(重载运算符)
- [翻译]Shape comparison language
- windows下mysql提示Can't connect to MySQL server on 'localhost'
- 【BZOJ】1367: [Baltic2004]sequence
- VMware中安装RHEL 7.1后出现锁屏的解决方法
- jaxb中的类继承
- KNN的一些总结
- LeetCode 060 Permutation Sequence
- 学生成绩管理系统课程设计(C语言,链表实现)
- Shape comparison language
- Gson简要使用笔记
- 屏幕自动旋转和调节大小
- 【LeetCode OJ 011】Container With Most Water
- C#实现文件夹基本操作