1 条题解
-
0
题目重述
我们需要将数字表示为若干个不超过的正整数的和,满足以下条件:
- 每个加数不能被整除
- 加数的总数不能被整除
目标是找到满足条件的最小加数数量,如果无法表示则返回。
解题思路
-
关键观察:
- 设最大可用加数为(若)或(若)
- 最小加数数量满足: [ L = \lceil \frac{M}{K'} \rceil ]
- 需要保证
-
特殊情况处理:
- 当时:所有数都能被整除,直接返回
- 当时:无可用的加数,返回
-
调整策略:
- 若初始,则尝试:
- 增加至(需验证可行性)
- 或减少最大加数至重新计算
- 若初始,则尝试:
算法实现
#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
- 上传者