题意是给出A个杯子,一开始都朝上,每次可以翻B个杯子,问最少需要翻转多少次可以让所有杯子都朝下。
分类讨论:
首先对于A%B==0一类情况,直接输出。
对于A>=3B,让A减到[2B,3B)区间内,翻转次数累加上A/B-2。
当A>=2B时,分奇偶讨论:A为奇数B为偶数显然无解;AB同奇偶时最多需要3次,A偶数B奇数最多需要4次。
当A<2B时,分奇偶讨论:AB同奇偶时最多需要3次,A奇数B偶数无解,A偶数B奇数时,有F(A,B)=F(A,A-B)成立,可以转换成上面的情况求解即可。
具体证明画画图就知道了,将两个B分别放到对称的位置上,想办法调整使得每次改变自己需要的杯子就行。对于A偶B奇的F(A,B)=F(A,A-B),其实挺好想的,因为A是偶数,B是奇数,而每个杯子一共翻转了奇数次,而一共一定是要翻转偶数轮,因此每个杯子不翻转的次数也是奇数次,也就相当于对“翻转”操作“取反”,每次翻转A-B个,结果是一样的,因此F(A,B)=F(A,A-B)成立。
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#define ll __int64
#define pi acos(-1.0)
#define MAX 5000001
using namespace std;
ll solve(ll n,ll m)
{
if(n%m==) return n/m;
if(n%==&&m%==) return -;
if(n>=*m) return n/m-+solve(n%m+*m,m);
if(n%==m%) return ;
if(n>=*m) return ;
return solve(n,n-m);
}
int main(){
ll n,m;
while(cin>>n>>m){
ll ans=solve(n,m);
if(ans<) cout<<"No Solution!"<<endl;
else cout<<ans<<endl;
}
return ;
}