1 条题解

  • 5
    @ 2025-10-18 19:31:06

    本蒟蒻的第一篇题解

    一道数论题,用了10分钟的时间想了下思路 (还特意问了一下数学奥赛的同桌求证,丢人)

    二进制应该都知道吧:就是第n位就是2(^(n^n^-1^1)^)

    那么这个就先推一下

    那我们不妨来列一下前几个2的幂:

    1、2、4、8、16、32、64、128、256……

    分别对应:

    212^1222^2232^3、……(懒得打了)

    我们可以发现(就是都试试)便可以知道:

    202^0222^2242^4262^6、……等2的偶次幂都%3=1

    212^1232^3252^5272^7、……等2的奇次幂都%3=2

    则我们就可以对n分情况讨论

    if(n==1)
    

    你绝对找不出不一个质因数都是2的数能整除3,直接-1抬走

    if(n==2)
    

    那我们可以找到找一个2的奇次幂和一个2的偶次幂 即:设这两个数为x,y且x=s3+1,y=t3+1x=s*3+1,y=t*3+1x+y=(s+t)3+3=(s+t+1)3x+y=(s+t)*3+3=(s+t+1)*3

    显然(x+y)%3==0

    就是将1和1挨一起——11

    if(n==3)
    

    那我们找三个二的同奇or同偶次幂,设这三个数为x,y,z且x=s3+1,y=t3+1,z=q3+1x=s*3+1,y=t*3+1,z=q*3+1(其实也可以+2)

    则:x+y+z=s3+t3+q3+3(6)=(s+t+q+1(2))3x+y+z=s*3+t*3+q*3+3(6)=(s+t+q+1(2))*3

    显然(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

    信息

    ID
    3856
    时间
    2000ms
    内存
    128MiB
    难度
    8
    标签
    (无)
    递交数
    134
    已通过
    19
    上传者