本文主要是介绍所有数的源头是奇数和2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
cFround928div4的E题
题目解析
解析有少许条件省略,先看完题目再看解析。
该题给你n张卡片,让你每次从左到右放置数字为m倍的奇数(从1,3,5等等逐渐增加直到i是使m*(2*i-1)小于n的最大i后停止)(m也从1逐渐增加)
例如,n=22;则先放置1 3 5 7 9 11 13 15 17 19 21,接着放2 6 10 14 18 22,接着放,4 12 20,接着放,8最后放16
解释:
一开始看作(1~22)1取奇数11个,剩下11个
然后看作(1~11)2取奇数6个,然后分别2,剩下五个
再看作(1~5)2取奇数3个,分别4,剩下两个
最后看作(1~2)2取奇数1个并且8,剩下一个116,取1并且乘16。
代码解析
同样也是看jiangly的代码有的思路,大哥受我一拜。
#include "bits/stdc++.h"#define For for(int i=1;i<=n;i++)
#define Whole(x) for(auto item:x)
using namespace std;
using ll = long long;
const int N = 2e5 ;
vector<int> arr(N),brr(N);
void inline solve() {int n,k;cin>>n>>k;int tmp=1;while(1){int cot=(n+1)>>1;//计算此时剩下的数组中的相对奇数有多少//相对奇数指,如果这一堆数都是偶数,那么同时除以二,直到,不都是偶数,那么剩下来的一群数就叫做这一堆数数中的相对奇数//而得到相对奇数过程中所除以得最终数叫做,这次得相对指标,例如2,4,6,8除以2得到1,2,3,4可知相对奇数为2,4,相对指标为2if(k<=cot){cout<<(2*k-1)*tmp<<endl;//tmp指的是每次循环求相对奇数的相对指标的乘积return;}k-=cot;tmp*=2;//每次的相对指标必然为2n/=2;//这样一来,n指的就是去掉了相对奇数之后所剩下了多少数字,同时得到了一堆新数,进而再次循环求这群薪数中的相对奇数}
}int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int num = 1;cin >> num;while (num--) {solve();}return 0;
}
思考
由上述抽丝剥茧的把一层一层的奇数去掉,我仿佛意识到,所有的数都是由奇数和2得来的,任何一个偶数都是可以通过某一个奇数乘以若干个2得到。
这篇关于所有数的源头是奇数和2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!