• 【BZOJ】1436: Poi2003 Trinomial


    题意

    (q(1 le q le 10000))次询问,每一次求((x^2+x+1)^n)的第(k)项系数模3。

    分析

    听说正解是(inom{2n}{m} (m \% 2+1)),表示不会。
    我来一个说一个我yy出来的玄学做法

    [(x^2+x+1)^n = sum_{i=0}^{n} inom{n}{i} sum_{j=0}^{i} inom{i}{j} x^{i+j} ]

    (k)项的系数就是(sum_{i=0}^{k} inom{n}{i} inom{i}{k-i} mod 3)

    $$ egin{align} & sum_{i=0}^{k} inom{n}{i} inom{i}{k-i} mod 3 \ = & sum_{j=0}^{2} sum_{i=0}^{left lfloor frac{k-j}{3} ight floor} inom{n \% 3}{(3i+j) \% 3} inom{left lfloor frac{n}{3} ight floor}{left lfloor frac{3i+j}{3} ight floor} inom{(3i+j) \% 3}{(k-(3i+j)) \% 3} inom{left lfloor frac{3i+j}{3} ight floor}{left lfloor frac{k-(3i+j)}{3} ight floor} mod 3 \ = & sum_{j=0}^{2} inom{n \% 3}{j} inom{j}{(k-j) \% 3} sum_{i=0}^{left lfloor frac{k-j}{3} ight floor} inom{left lfloor frac{n}{3} ight floor}{i} inom{i}{left lfloor frac{k-j}{3} ight floor-i} mod 3\ end{align} $$

    然后变成3个子问题,由于可以根据(inom{n%3}{j} inom{j}{(k-j)%3})是否为(0)还有(left lfloor frac{k-1}{3} ight floor == left lfloor frac{k-2}{3} ight floor)之类的强力减枝,所以很快。
    虽然理论复杂度是单次查询(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
    ", f(n, k));
    	}
    	return 0;
    }
  • 相关阅读:
    no-useless-call (Rules) – Eslint 中文开发手册
    Java 8 Stream
    CSS3 ,checked 选择器
    MySQL 数据类型
    _Alignas (C keywords) – C 中文开发手册
    C 库函数 – modf()
    JavaScript E 属性
    SyntaxError.prototype (Errors) – JavaScript 中文开发手册
    swagger和openAPI: 上传文件
    Java中HashMap的putAll()方法: HashMap.putAll()
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/4985679.html
Copyright © 2020-2023  润新知