A炼金术师
单调栈
#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
int n;
int a[N];
stack<int> stk;
int main()
{
cin >> n;
for (int i = 0; i < n; i ++ )
scanf("%d", &a[i]);
stk.push(a[0]);
for (int i = 1; i < n; i ++ )
{
while (stk.size() > 0 && stk.top() <= a[i]) stk.pop();
stk.push(a[i]);
}
cout << stk.size() << endl;
return 0;
}
刀工对决
不断操作,最后a与b相等。
所以,我们可以先将a和b的公因子除去,因为这部分显然相等,切不需要进行操作来实现。
然后,如果可以实现a与b相等,那么,a与b一定没有公因子,且a与b均为3或5的倍数,且a与b公因子为1
那么,我们需要将5全部转化为3,然后,统计a和b中3的个数,将他们的差抹去。
#include <bits/stdc++.h>
using namespace std;
int n;
int a, b;
int ans;
int solve()
{
int d = __gcd(a, b);
a /= d; b /= d;
int cnt = 0;
int a3 = 0, b3 = 0;
while (a % 5 == 0) cnt ++, a = a / 5 * 3;
while (b % 5 == 0) cnt ++, b = b / 5 * 3;
while (a % 3 == 0) a /= 3, a3 ++;
while (b % 3 == 0) b /= 3, b3 ++;
cnt += abs(a3 - b3);
if (a != 1 || b != 1)
{
return -1;
}
return cnt;
}
int main()
{
cin >> n;
while (n -- )
{
scanf("%d%d", &a, &b);
int t = solve();
if (t == -1)
{
cout << -1 << endl;
return 0;
}
else
ans += t;
}
cout << ans << endl;
return 0;
}
小G的GCD
打表,将题目中的程序打出来,观察可以发现数列性质满足斐波那契数列
#include <bits/stdc++.h>
using namespace std;
long long GCD(long long x, long long y) {
if (!y) return 1ll;
return GCD(y, x % y) + 1ll;
}
long long maxGCD(long long n) {
long long ans = 0ll;
for (long long i = 1; i <= n; i++)
for (long long j = 1; j <= n; j++)
ans = max(ans, GCD(i, j));
return ans;
}
typedef long long ll;
ll n;
ll f[1000];
void fib()
{
f[1] = 1;
f[2] = 1;
for (int i = 3; i <= 80; i ++ )
f[i] = f[i - 1] + f[i - 2];
}
int main()
{
cin >> n;
ll t = n;
fib();
int ans = 2;
for (int i = 1; n > f[i]; i ++ )
// for (int i = 1; ; i ++ )
{
// if (n > f[i])
// {
ans ++;
n -= f[i];
// }
// else break;
}
cout << ans << endl;
// cout << maxGCD(t) << endl;
// cout << f[100] << endl;
// for (long long i = 1; i <= t; i ++ )
// {
// printf("%10d", maxGCD(i));
// if (i % 10 == 0) puts("");
// }
return 0;
}