1 条题解

  • 0
    @ 2025-5-19 18:50:34

    题目重述

    我们需要将数字MM表示为若干个不超过KK的正整数的和,满足以下条件:

    1. 每个加数不能被NN整除
    2. 加数的总数不能被NN整除

    目标是找到满足条件的最小加数数量,如果无法表示则返回1-1

    解题思路

    1. 关键观察

      • 设最大可用加数为K=KK' = K(若KmodN0K \mod N \neq 0)或K=K1K' = K-1(若KmodN=0K \mod N = 0
      • 最小加数数量LL满足: [ L = \lceil \frac{M}{K'} \rceil ]
      • 需要保证LmodN0L \mod N \neq 0
    2. 特殊情况处理

      • N=1N=1时:所有数都能被11整除,直接返回1-1
      • K<1K'<1时:无可用的加数,返回1-1
    3. 调整策略

      • 若初始LmodN=0L \mod N = 0,则尝试:
        • 增加LLL+1L+1(需验证可行性)
        • 或减少最大加数至K1K'-1重新计算LL

    算法实现

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<algorithm>
    #include<cstring>
    
    using namespace std;
    
    int main()
    {
    	int tmp,k,m,n,ans,t,res,tmpres;
    	scanf("%d",&t);
    	while(t--)
    	{
    		ans=0;
    		scanf("%d%d%d",&n,&m,&k);
    		if(n==1)
    		{
    			printf("-1\n");
    			continue;
    		}
    		if(k==1)
    		{
    			if(m%n==0)
    				printf("-1\n");
    			else printf("%d\n",m);
    			continue;
    		}
    		if(n==2)
    		{
    			if(m%n==0) printf("-1\n");
    			else
    			{
    				if(k%2==0) k--;
    				ans=m/k;
    				res=m%k;
    				if(res>0)
    				{
    					ans++;
    					if(res%2==0)ans++;
    				}
    				printf("%d\n",ans);
    			}
    			continue;
    		}
    		if(k%n==0) k--;
    		res=m%k;
    		ans+=m/k;
    		if(res==0)
    		{
    			if(ans%n==0) ans++;
    			printf("%d\n",ans);
    			continue;
    		}
    		else//res>0
    		{
    			ans++;
    			if(ans%n==0) ans++;
    			else
    			{
    				if(res%n==0)
    				{
    					if(ans==1) ans++;
    					else if((k-1)%n==0)
    					{
    						bool flag=false;
    						for(int i=1;i<n&&i+res<=k&&i<k;i++)
    						{
    							if((res+i)%n!=0&&(k-i)%n!=0)
    							{
    								flag=true;
    								break;
    							}
    						}
    						if(!flag)
    						{
    							ans++;
    							if(ans%n==0) ans++;
    						}
    					}
    				}
    			}
    			printf("%d\n",ans);
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    2895
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者