旋转的二进制
Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 0Accepted Submission(s): 0
Problem Description
给定一个自然数M,及其二进制长度N,得到一个N位的二进制串b1 b2 ... bN-1 bN 将该串做左旋转,即b1移到bN后面,得到一个新的二进制串:b2 b3 ... bN-1 bN b1 对新的二进制串再做左旋转,得二进制串b3 b4 ... bN-1 bN b1 b2 重复旋转操作操作,可得N个二进制串,对这N个串排序,可得一个N*N的矩阵. 例如: 1 0 0 0 1->0 0 0 1 1->0 0 1 1 0->0 1 1 0 0->1 1 0 0 0 对它们做排序,得矩阵
00011 00110 01100 10001 11000
问:给出一个自然数M,及其二进制长度N,求出排序矩阵的最后一列。
对于上面的例子,给出M=3,N=5,要你的程序输出10010。
Input
第一行有一个自然数K,代表有K行测试数据(K<=1000)。 第二行至第K+1行,每行的第一个为自然数M,第二个为二进制长度N(N<64)。
Output
输出K行,每行N个二进制,表示矩阵最后一列从上到下的二进制。
Sample Input
3 3 5 4 7 1099512709120 45
Sample Output
10010 1000000 110000000000000000000000000000100000000000000
主要使用了位操作,模拟得出结果,注意在输入了m之后,考虑到n可能与m的实际二进制长度不符(大或小),所以我用了一个循环来确定rem[0]的值。
还有在对1进行<<操作时,要先将其做类型转换,否则系统会将其默认为int而导致出错
代码:
#include
#include
#include
#include
#include
using namespace std;
unsigned long long rem[70];
int main()
{
unsigned long long num;
unsigned long long m,n;
cin>>num;
while(num--)
{
cin>>m>>n;
memset(rem,0,sizeof(rem));
for(unsigned long long i=1;
i<(unsigned long long(1)<0) rem[0]=(rem[0]|i);
}
//rem[0]=m;
unsigned long long hed=(unsigned long long(1)<<(n-1)),bac;
for(int i=1;
i0)
{
bac=1;
unsigned long long tem=(unsigned long long(1)<=tem)
rem[i]=rem[i]-tem;
}
else
{
bac=0;
}
rem[i]=rem[i]|bac;
}
sort(rem,rem+n);
for(int i=0;
i
【水|携程编程大赛 (预赛第一场)1004旋转的二进制】
推荐阅读
- 思维|Codeforces Round #411(Div. 2)D. Minimum number of steps【思维递推+快速幂】
- 蓝桥杯历届试题|第九届蓝桥杯(国赛)——约瑟夫环
- 水|POJ动态规划20题,一句话题解~
- hdu-2602 Bone Collector C#_Ex