hdu 6129(找规律lucas)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 6129(找规律lucas)相关的知识,希望对你有一定的参考价值。

把初始a的每一个元素对m次变换的贡献写出来,发现是一个斜着的杨辉三角,根据lucas,当且仅当a&b == b,C(a, b)为奇数,又因为&和^运算极快,4e10的复杂度也就跑了一秒。

技术分享
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <string>
#include <cmath>
#include <map>
using namespace std;
const int maxn = 200005;
int a[maxn], b[maxn];
int solve(int x, int y)
{
//    cout << "x == " << x << " y == " << y << endl;
    if(x == 1)
        return a[y];
    if(y == 1)
        return a[1];
    int tmp = min(x, y);
    for(int i = 30; i >= 0; --i)
        if(tmp - (1 << i) > 0)
        {
            return solve(x - (1 << i), y) ^ solve(x, y - (1 << i));
        }
}
int main()
{
//    freopen("1010.in", "r", stdin);
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n, m;
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= n; ++i)
        {
            scanf("%d", &a[i]);
        }
        memset(b, 0, sizeof(b));
        for(int i = 0; i <= n - 1; ++i)
        {
            int y = m + i - 1, x = i;
//            cout << "x == " << x << " y == " << y << endl;
            if((x & y) == x)
            {
                for(int j = 1; j + i <= n; ++j)
                    b[j + i] ^= a[j];
            }
        }
        for(int i = 1; i <= n; ++i)
        {
            if(i != 1)
                printf(" ");
            printf("%d", b[i]);
        }
        printf("\n");
    }
}
View Code

以上是关于hdu 6129(找规律lucas)的主要内容,如果未能解决你的问题,请参考以下文章

hdu 6129 Just do it 找规律

Just do it HDU - 6129 (Lucas)

组合数+Lucas定理2017多校训练七 HDU 6129 Just do it

HDU6129 规律

HDU 6129 Just do it 数学 杨辉三角 递推

hdu 6129 Just do it