emmmm,就写出来一个A题
感觉这场要掉一百分妈的纯傻逼我是
开补吧
思路:
看能分多少个k-1出来吧,再看最后的余数为多少
代码:
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
ll n,k,sum=0;
cin>>n>>k;
while(n>k){
n-=(k-1);
sum++;
}
if(n!=1) sum++;
cout<<sum<<endl;
}
return 0;
}
思路:
因为可以连续操作无数次,我们可以把每一段连续的0都看作一个0,最后统计0和1的个数,1多就可以(直接把起点和终点看作范围),0多就不行
代码:
void solve()
{
string s;
ll n;
ll c1 = 0, c0 = 0;
cin >> n;
cin >> s;
for (int i = 0; i < n; i++)
{
if (s[i] == '1')c1++;
if (s[i] == '0' && (s[i - 1] != '0' || i == 0))c0++;
}
if (c1 > c0)cout << "Yes" << endl;
else
cout << "No" << endl;
return;
}
思路:
我们要满足三个条件:
1.a里的所有数都小于等于n
2.a为递增
3.ai|ai-1必须为n
要满足这几个条件我们还得从n本身来看,为了使数或一个比它大的数为n,我们从n的二进制从后往前来看,我们统计n的二进制中有多少个1,依次从右到左对不同的1取非操作,有多少个1,得到的序列长度就是1的数目+1(n的本身也算),序列中的数就是n的二进制从右开始对1取非之后的转换为十进制的数
代码:
void solve()
{
ll n;
cin >> n;
int bit = 63;
vector<int>a;
for (int i = 63; i >= 0; i--)
{
if ((n >> i) & 1)
{
int mark = ~(1ll << i);
int k = mark & n;
if (k != 0)
{
a.push_back(k);
}
}
}
a.push_back(n);
cout << a.size() << endl;
for (auto x : a)
cout << x << " ";
cout << endl;
}