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

  题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6129

  题目描述: 将a序列转化成b序列, b[i] = a[1]^a[2]^a[3]^a[4]^......^a[i] 重复m次, 求b

  解题思路: 我开始找的是系数的规律发现他满足杨辉三角, 也就是说我现在给出n 和 m , 然后求最后一项是奇数还是偶数, 然后自己就死推呀, 推了两个多点儿把所有的表都打遍了也没找到规律.....其实是有公式的......: C(x+y-2, y-2) 表示第i项循环y次的杨辉三角最上端的数, 而我们只关心这个数的奇偶, 如果是奇数我们就向下传递

  代码: 

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <stack>
#include <deque>
#include <map>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define mem0(a) memset(a,0,sizeof(a))
#define meminf(a) memset(a,0x3f,sizeof(a))
typedef long long ll;
using namespace std;

//const int INF = 0x3fffffff;
const int maxn = 2e6 + 10;
int a[maxn];
int ans[maxn];

int main() {
    int t;
    scanf( "%d", &t );
    while( t-- ) {
        int n, m;
        scanf( "%d %d", &n, &m );
        mem0(a);
        mem0(ans);
        for( int i = 1; i <= n; i++ ) {
            scanf( "%d", a+i );
        }
        for( int i = 1; i <= n; i++ ) {
            
            int x = m+i-2;
            int y = i-1;
            if( (x & y) == y ) {
                for( int j = 1; j <= n; j++ ) {
                    ans[j] ^= a[j-i+1];
                }
            }
        }
//        cout << n << endl;
        for( int i = 1; i <= n; i++ ) {
            if( i == 1 ) {
                printf( "%d", ans[i] );
            }
            else printf( " %d", ans[i] );
        }
        printf( "\n" );
        
    }
    return 0;
}
View Code

  思考: 数学好重要QAQ, 我是真的菜, 如果会数学的话就不会打表找规律好长时间也找不到................

posted on 2017-08-16 12:38  FriskyPuppy  阅读(207)  评论(0编辑  收藏  举报

导航