CodeforceC1,C2-k-LCM(思维)

easy题目链接

hard题目链接


题意:

两个题意差不多给出你一个n和k,将n分成k份

  1. 使得 k个数和为n.
  2. 使得k个数的lcm小于等于n/2

easy版的k为3
hard版的k小于等n大于等于3

思路:

先说easy版,因为就是分成三个数,那么我们呢可以之间判断是否是偶数.

  • 不是偶数,直接就是拿出一个1.剩下的平分.
  • 是偶数,再去判断能否四等分,能的话我们分成1,1,2,这样两个条件都能满足,不能四等分,那么我们知道n是偶数而且部呢个四等分 那么n/2是奇数,所以我们先拿出一个2,剩下的平分,平分后的一定是偶数,即求lcm就是平分的数,不会超过n/2.

再看hard版,他从3份变成了k份,但是我们还是能找到相同性,就是拿出3份对n的部分进行符合条件的转化,就变成了easy版.通过1与任何数求lcm都是它本身我们可以想到我们可以先拿出(k-3)个1.那么我们就剩下3分,对(n-k+3)处理就转化成easy版了.

	ll t;
    cin >> t;
    while(t--)
    {
    
    
    	///easy版
    	cin>>n>>m;
    	if(n%2){
    
    
    		cout<<1<<" "<<n/2<<" "<<n/2<<endl;
    	}else {
    
    
    		if(n%4){
    
    
    			cout<<2<<" "<<n/2-1<<" "<<n/2-1<<endl;
    		}else {
    
    
    			cout<<n/2<<" "<<n/4<<" "<<n/4<<endl;
    		}
    	}
    	/*
    	///hard版    	
    	cin>>n>>m;	
        n -= (m - 3);///独立除出来三个 
        ///独立出来三个就剩下的平分,可以保证lcm小于等n/2
        for(int i = 1; i <= m - 3; i++) cout << 1 << " ";/// 先把前面的整上1
        
        ///多一 直接半分就行
        if(n % 2) cout << 1 << " " << n / 2 << " " << n / 2 << endl;
        else///偶数
        {
            if(n % 4)/// 因为是偶数,不能整除4,那么n/2 一定是一个奇数
            {
                cout << 2 << " " << n / 2 - 1 << " " << n / 2 - 1 << endl;
            }
            else///能够整除那么可以分成4份
                cout << n / 2 << " " << n / 4 << " " << n / 4 << endl;
        }*/
    }

猜你喜欢

转载自blog.csdn.net/weixin_45911397/article/details/114988963
今日推荐