A. Puzzle Pieces
求能否将拼图拼成nm,可推出只有当nm <= n+m才能满足条件
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <vector>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
const int p = 2008;
const double eps = 1e-8;
#define sd(a) scanf("%d", &a)
#define sdd(a, b) scanf("%d%d", &a, &b)
#define sss(a, b) scanf("%s%s", a, b)
int main() {
int t;
ll n, m;
cin >> t;
while(t --){
cin >> n >> m;
if((ll)n * m <= n + m){
cout << "YES" << endl;
}
else{
cout << "NO" << endl;
}
}
return 0;
}
B. Card Constructions
给n张牌堆金字塔,每次堆到不够牌往上堆再去用余下的纸牌堆下一个塔,问能堆多少个塔?
可推出高度为h的塔要用(3h²+h)/2张牌,则解(3h²+h)/2 <= n可得由n张牌可堆出最高的塔的高度为h = (sqrt(1 + 24n) - 1)/6 (注意24*n可能会爆int)
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
const int p = 2008;
const double eps = 1e-8;
#define sd(a) scanf("%d", &a)
#define sdd(a, b) scanf("%d%d", &a, &b)
#define sss(a, b) scanf("%s%s", a, b)
int main() {
int t;
ll n, x;
cin >> t;
while(t --){
cin >> n;
int ans = 0;
while(n > 1){
ans ++;
x = (ll)((1.0 * sqrt(1 + 24 * n) - 1) / 6.0);
n -= x * (3 * x + 1) / 2;
}
cout << ans << endl;
}
return 0;
}
C. Hilbert’s Hotel
已知n, a0, a1, a2, …, an-1,问对于1~n-1中的每个数k变为(k+ak)mod n(要求非负)后,改变后的数是否存在重复。若存在重复,则为NO
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
const int p = 2008;
const double eps = 1e-8;
#define sd(a) scanf("%d", &a)
#define sdd(a, b) scanf("%d%d", &a, &b)
#define sss(a, b) scanf("%s%s", a, b)
ll a[N], vis[N];
bool success;
int main() {
int t;
ll n, x;
cin >> t;
while(t --){
cin >> n;
memset(vis, 0, sizeof(vis));
for(int i = 0; i < n; i ++){
cin >> a[i];
}
success = true;
for(int i = 0; i < n; i ++){
ll x = ((i + a[i]) % n + n) % n;
if(vis[x]){
success = false;
break;
}
else{
vis[x] = 1;
}
}
if(success){
cout << "YES" << endl;
}
else{
cout << "NO" << endl;
}
}
return 0;
}