BC160. 小q的数列
描述
小q最近迷上了各种好玩的数列,这天,他发现了一个有趣的数列,其递推公式如下:输入描述
输入第一行一个t输出描述
输出每行两个正整数示例1
输入:
2 0 1
输出:
0 0 1 1
C 解法, 执行用时: 89ms, 内存消耗: 3728KB, 提交时间: 2022-07-17
#include <stdio.h> #include <math.h>//分析题目可得,fn为n的二进制中1的个数 int main(){ int t, count; long n; scanf("%d", &t); for(int i = 0; i < t; i++){ scanf("%ld", &n); count = 0; while(n){ count += n & 1 == 1? 1 : 0; //对应二进制1的个数 n >>= 1;//右移后赋值 } printf("%d %ld\n", count, (long)pow(2, count) - 1); } return 0; }
C 解法, 执行用时: 89ms, 内存消耗: 3752KB, 提交时间: 2022-07-02
#include <stdio.h> #include <math.h> int main(){ int t, count; long n; scanf("%d", &t); for(int i = 0; i < t; i++){ scanf("%ld", &n); count = 0; while(n){ count += n & 1 == 1? 1 : 0; //对应二进制1的个数 n >>= 1; } printf("%d %ld\n", count, (long)pow(2, count) - 1); } return 0; }
C 解法, 执行用时: 89ms, 内存消耗: 3820KB, 提交时间: 2022-06-14
// 首先理解题意 f[n]的值就是n转化为二进制中的1的个数 // f(n)' 就是找最小项的话 可以看到是2的幂次-1 #include<stdio.h> int main() { long long t,n,i; scanf("%lld",&t); while(t--) { long long sum=0,num=0; scanf("%lld",&n); while(n) { sum++; n=n&(n-1); } for(i=0;i<sum;i++) num=num*2+1; printf("%lld %lld\n",sum,num); } }
C 解法, 执行用时: 89ms, 内存消耗: 4888KB, 提交时间: 2022-07-15
//有变量n,n',f(n),f(n')共四个 //step1:将十进制数n转换为二进制数a //step2:求二进制数a中1的个数x,f(n')=f(n)=x; //step3:最早出现的n'就是2的0次方一直加到2的X次方(2的a次方-1; #include<stdio.h> int main() { long long int t = 0; long long int n = 0; long long int i = 0; scanf("%lld",&t); while(t--)//通过while循环来打印t行数据 { long long int a = 0; long long int b = 0; scanf("%lld",&n);//输入每行数据 while(n)//每行数据进行操作 { n=n&(n-1);//判断一个数据的二进制有多少个1 a++;//每一个1就加加,a的结果等于f(n) } for(i=0;i<a;i++) { b=b*2+1; } printf("%lld %lld\n",a,b); } return 0; }
C 解法, 执行用时: 90ms, 内存消耗: 3716KB, 提交时间: 2022-06-27
#include<stdio.h> int main() { long long int t = 0; long long int n = 0; long long int i = 0; scanf("%lld",&t); while(t--)//通过while循环来打印t行数据 { long long int a = 0; long long int b = 0; scanf("%lld",&n);//输入每行数据 while(n)//每行数据进行操作 { n=n&(n-1);//判断一个数据的二进制有多少个1 a++;//每一个1就加加,a的结果等于f(n) } for(i=0;i<a;i++) { b=b*2+1; } printf("%lld %lld\n",a,b); } return 0; }