题目大意:
对于一个数字对,可以将其变为新数字对或。
给定一正整数n,问最少需要多少次操作可将数字对变为一个数字对,且该数字对有一个为n。
思路:
真的不会做啊。。。
考试时想了,,,但是都至少是的算法,对于根本吃不消。
最后还是打了一个灰溜溜的交上去,30分。
正解:数论,
有谁看得出这是的题目???
对于给定的,我们可以枚举所有的,模拟还原,最终步数最少的就是最终解。
这道题可以类比求的辗转相除法。
若 ,则
若 ,则
当达到一定次数时,,那么这就是一个合法的解。如果时,没有等于过,那么这个解就不合法。
代码:
#include <cstdio>
#include <iostream>
using namespace std;
int n,ans;
int gcd(int a,int b) //辗转相除法
{
if (!b) return 99999999; //b到达0且没有等于过1,无解
if (b==1) return a-1; //b=1,有借
return gcd(b,a%b)+a/b;
}
int main()
{
scanf("%d",&n);
ans=99999999;
for (int i=1;i<=(n+1)/2+1;i++) //简单精简。
ans=min(ans,gcd(n,i));
return printf("%d\n",ans)&0;
}