Just do it HDU - 6129 (Lucas)

Just do it

HDU - 6129

题意:给出n个元素的数组a,让你异或m次得到新的数组b。 每一次得到的b[i]都是a[0]一直异或到a[i],然后把b赋值给a,循环m次得到b。

碰到异或的题,一定要考虑很重要的一个性质,a^b^b==a !!

就是说异或偶数次同一个数之后值不变!

对于这道题,我们可以考虑a的每一个数对b的影响。

对于a[1],b[i]异或a[1]的次数如下表:

第一次变换: 1 1 1 1 1

第二次变换: 1 2 3 4 5

第三次变换: 1 3 6 10 15

第四次变换: 1 4 10 20 35

可以发现,该表从左下往右上看是组合数表!于是我们可以通过求组合数轻松得到每一个数对后面的数的影响次数!

关键:如何判断影响次数的奇偶性!

这里用到了Lucas定理,简单来说就是C(x,y)是奇数当且仅当(x&y)==y。

稍微分析一下就可以得到,晚上再补分析~

先贴上代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=2e5+10;
 4 int a[maxn],b[maxn];
 5 int n,m;
 6 int main(){
 7     int t;
 8     scanf("%d",&t);
 9     while(t--){
10         scanf("%d%d",&n,&m);
11         for(int i=1;i<=n;i++){
12             scanf("%d",&a[i]);
13             b[i]=0;
14         }
15         for(int i=1;i<=n;i++){
16             int x=i+m-2;
17             int y=i-1;
18             if((x&y)==y){
19                 for(int j=i;j<=n;j++) b[j]^=a[j-i+1];
20             }
21         }
22         for(int i=1;i<=n;i++) printf("%d%c",b[i],i==n?‘\n‘:‘ ‘);
23     }
24     return 0;
25 }

时间: 2024-11-10 07:54:03

Just do it HDU - 6129 (Lucas)的相关文章

hdu 1874(Dijkstra )

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27692    Accepted Submission(s): 10019 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路

hdu 4194(模拟)

符合三者之一的则不满足规定,求不满足规定的个数.直接模拟. 1.被同一个人审查多次 2.被和自己同一组织的审查 3.被审查次数不等于k 代码如下: 1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-06-28 17:36 5 * Filename :

hdu 4196(数论)

题意:问小于n的数的乘积能拼成的最大平方数是多少? 思路:给n!做质数分解在除去指数为奇数的那些质数,由于题目中需要模运算所以不能直接除,必须乘上摸逆. 代码如下: 1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-06-28 15:26 5 * Fi

Hdu 1402 (FFT)

题目链接 A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12490    Accepted Submission(s): 2206 Problem Description Calculate A * B. Input Each line will contain two integers A and

HDU 1695(GCD)

GCD Time Limit: 3000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u [Submit]   [Go Back]   [Status] Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common

HDU 1506 &amp;&amp; HDU1505 &amp;&amp; HDU 2870 (DP).

~~~~ 这三道DP题是逐层递进的,大家可以从前往后做. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506 http://acm.hdu.edu.cn/showproblem.php?pid=1505 http://acm.hdu.edu.cn/showproblem.php?pid=2870 ~~~~ 1506: 分别找每一块板子的可以的最左边界和最右边界,注意这时不能用两个for暴力(显然会TLE),所以要用DP的思想边搜边保存. 另外注

hdu 1800 (map)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1800 Flying to the Mars Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10830    Accepted Submission(s): 3472 Problem Description In the year 8888, t

HDU 4821 (hash)

这道题最重要的不仅是hash这种算法,更要学会利用好STL中的<map>才行. 将连续的L个字符经过hash赋值,最后线性判断.其中的判断步骤用到了map的插入特性. #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <map> using namespace std; #define maxn 500010 #

hdu 4643(计算几何)

题意:容易理解 分析:切换的地点为两个基站所在直线的中垂线与两座城市所在直线的交点. 代码实现: #include <cstdio> #include <cmath> #include <algorithm> #define maxn 60 #define eps 1e-7 using namespace std; int dcmp(double x) //控制精度 { if(fabs(x)<eps) return 0; else return x<0?-1