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; }
思考: 数学好重要QAQ, 我是真的菜, 如果会数学的话就不会打表找规律好长时间也找不到................
posted on 2017-08-16 12:38 FriskyPuppy 阅读(207) 评论(0) 编辑 收藏 举报