1 条题解
-
5
本蒟蒻的第一篇题解
一道数论题,用了10分钟的时间想了下思路
(还特意问了一下数学奥赛的同桌求证,丢人)二进制应该都知道吧:就是第n位就是2
那么这个就先推一下
那我们不妨来列一下前几个2的幂:
1、2、4、8、16、32、64、128、256……
分别对应:
、、、……(懒得打了)
我们可以发现(就是都试试)便可以知道:
、、、、……等2的偶次幂都%3=1
而、、、、……等2的奇次幂都%3=2
则我们就可以对n分情况讨论
if(n==1)你绝对找不出不一个质因数都是2的数能整除3,直接-1抬走
if(n==2)那我们可以找到找一个2的奇次幂和一个2的偶次幂 即:设这两个数为x,y且 则
显然(x+y)%3==0
就是将1和1挨一起——11
if(n==3)那我们找三个二的同奇or同偶次幂,设这三个数为x,y,z且(其实也可以+2)
则:
显然(x+y+z)%3==0
就是将1、1和1用0隔开——10101
注:这个情况要保证m>=2,要么-1抬走
if(n>3)???还是
显然,证b其实是将n按奇偶分为2+2+2+……+2/2+2+2+……+3
不就简单了吗
显然,证b还是要注意下没有前导0的
既然数论都懂了,去写代码吧
(我居然做这题时先用了10min想个骗分才用1min想的数论)#include<bits/stdc++.h> using namespace std; int t,n,m,nm; int main() { cin>>t; while(t--){ cin>>n>>m; nm=n+m; //字符串长度求出来,有用 if(n<2){ cout<<-1<<endl<<-1; //n小于2还犹豫啥 } else if(n%2==0){ //探讨n的奇偶性 for(int i=0;i<n;i++){cout<<1;} //直接将所有1扔出去,绝对满足11 for(int i=0;i<m;i++){cout<<0;} cout<<endl; if(nm%2==0){ //若长度为偶数,一定能保证最高位和最低位对应的2的次幂为一奇一偶 cout<<1; for(int i=0;i<m;i++){cout<<0;} for(int i=0;i<n-1;i++){cout<<1;} } else{ //不行的话只能把后面一个1往前移一个,在补1 cout<<1; for(int i=0;i<m-1;i++){cout<<0;} cout<<1<<0; for(int i=0;i<n-2;i++){cout<<1;} } } else{ if(m<2){ //用于间隔的0不够,-1抬走 cout<<-1<<endl<<-1; } else{ cout<<1; for(int i=0;i<n-3;i++){cout<<1;} cout<<0<<1<<0<<1; //因为有0间隔,要尽可能把0往后移 for(int i=0;i<m-2;i++){cout<<0;} cout<<endl; if(nm%2==1){ //若长度为奇数,一定能保证最高位和最低位对应的2的次幂为同奇同偶 cout<<1; for(int i=0;i<m-2;i++){cout<<0;} cout<<0<<1<<0<<1; //懒得写了剩下的自己想吧 for(int i=0;i<n-3;i++){cout<<1;} } else{ cout<<1; for(int i=0;i<m-2;i++){cout<<0;} cout<<1<<0<<1<<0; for(int i=0;i<n-3;i++){cout<<1;} } } } cout<<endl; } return 0; }我的思路第一个实现代码的不是我QwQ
- 1
信息
- ID
- 3856
- 时间
- 2000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 134
- 已通过
- 19
- 上传者
冀公网安备13090002000383号