裁纸刀
#include<iostream>
using namespace std;
const int n = 20, m = 22;
int main(){
cout << 4 + (n - 1) + n * (m - 1);//443
return 0;
}
抠出来(上下左右)+ 剪开行 + 每行分开
灭鼠先锋
#include<iostream>
using namespace std;
int main(){
cout << "VVVL";
return 0;
}
答案错误
给出的局面是指先手已经先的方案,而不是初始情况再从先手开始,审题!!!
LLLV
质因数个数
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const ll maxn = 1e8;
ll p[maxn];
bool isPrime(ll n){
ll sqr = sqrt(n);
for(ll i = 2; i <= sqr; i++){
if(n % i == 0) return false;
}
return true;
}
int main(){
ll n, num = 0, s, ans = 0;
scanf("%lld", &n);
s = sqrt(n);
for(int i = 2; i <= s; i++){
if(n % i == 0){
p[num++] = i;
if(i * i != n) p[num++] = n / i;
}
}
for(int i = 0; i < num; i++){
if(isPrime(p[i])) ans++;
}
printf("%lld", ans);
return 0;
}
通过0%(运行错误)
1e8的数组太大了,直接运行错误。
注意,n本身也是一个约数。所以当n是质数是,结果加一
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const ll maxn = 1e6;
ll p[maxn];
bool isPrime(ll n){
ll sqr = sqrt(n);
for(ll i = 2; i <= sqr; i++){
if(n % i == 0) return false;
}
return true;
}
int main(){
ll n, num = 0, s, ans = 0;
scanf("%lld", &n);
s = sqrt(n);
for(int i = 2; i <= s; i++){
if(n % i == 0){
p[num++] = i;
if(i * i != n) p[num++] = n / i;
}
}
for(int i = 0; i < num; i++){
if(isPrime(p[i])) ans++;
}
if(isPrime(n)) ans++;
printf("%lld", ans);
return 0;
}
选数异或
#include<iostream>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn], p[maxn] = {0};
int main(){
int n, m, x, l, r, ans;
scanf("%d%d%d", &n, &m, &x);
for(int i = 1; i <= n; i++){
scanf("%d", a + i);
for(int j = i - 1; j >= 1; j--){
if((a[i] ^ a[j]) == x) {
p[i] = j;
break;
}
}
}
// for(int i = 1; i <= n; i++){
// printf("%d, ", p[i]);
// }
// printf("\n");
while(m--){
scanf("%d%d", &l, &r);
ans = 0;
for(int i = r; i >= l; i--){
if(p[i] >= l){
ans = 1;
break;
}
}
if(ans) printf("yes\n");
else printf("no\n");
}
return 0;
}
GCD
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int main(){
ll a, b, k, x;
scanf("%lld%lld", &a, &b);
if(a < b) swap(a, b);
x = a - b;
printf("%lld", x - a % x);
return 0;
}
观察数据规律
爬树的甲壳虫
全排列的价值
#include<iostream>
using namespace std;
typedef long long ll;
long long m = 998244353LL;
int main(){
ll n, ans = 1, t;
scanf("%lld", &n);
if(n <= 1){
printf("0");
return 0;
}
for(ll i = 3; i <= n; i++){
ans = (ans * i) % m;
}
t = (n * (n - 1) / 2) % m;
printf("%lld", ans * t % m);
return 0;
}
找规律
注意两次除2的处理,要确保能被整除时进行,防止整数除数值错误
扫描游戏
数的拆分
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn = 5000;
ll p[maxn], flag[maxn] = {0}, num = 0;//flag[i] == 0表示i为素数
bool judge(ll n){
int i = 0, cnt;
while(n && i < num){
cnt = 0;
while(n % p[i] == 0){
n /= p[i];
cnt++;
}
i++;
if(cnt == 1) return false;
}
if(n == 0) return true;
ll sqr = sqrt(n);
if(sqr * sqr == n) return true;
ll tri = pow(n, 1.0 / 3);
if(tri * tri * tri == n) return true;
return false;
}
int main(){
ll t, a;
for(int i = 2; i < maxn; i++){
if(!flag[i]){
p[num++] = i;
for(int j = i * i; j < maxn; j += i) flag[j] = 1;
}
}
scanf("%lld", &t);
while(t--){
scanf("%lld", &a);
if(judge(a)) printf("yes\n");
else printf("no\n");
}
return 0;
}
通过10%(答案错误)
忽略了质数表里的数超过sqrt(n)的情况;
开方,或者开三次方是取整后的值,注意开方可能要取整的问题
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn = 5000;
ll p[maxn], flag[maxn] = {0}, num = 0;//flag[i] == 0表示i为素数
bool judge(ll n){
int i = 0, cnt;
while(n && i < num && p[i] * p[i] <= n){
cnt = 0;
while(n % p[i] == 0){
n /= p[i];
cnt++;
}
i++;
if(cnt == 1) return false;
}
ll sqr = sqrt(n);
while(sqr * sqr <= n){
if(sqr * sqr == n) return true;
sqr++;
}
ll tri = pow(n, 1.0 / 3);
while(tri * tri * tri <= n){
if(tri * tri * tri == n) return true;
tri++;
}
return false;
}
int main(){
ll t, a;
for(int i = 2; i < maxn; i++){
if(!flag[i]){
p[num++] = i;
for(int j = i * i; j < maxn; j += i) flag[j] = 1;
}
}
scanf("%lld", &t);
while(t--){
scanf("%lld", &a);
if(judge(a)) printf("yes\n");
else printf("no\n");
}
return 0;
}
重复的数
#include<iostream>
#include<string.h>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn], flag[maxn] = {0}, p[maxn] = {0}, temp[maxn];
int main(){
int n, m, l, r, k, cnt;
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", a + i);
flag[a[i]]++;
p[i] = flag[a[i]];//出现过的次数
}
scanf("%d", &m);
while(m--){
cnt = 0;
memset(temp, 0, sizeof(temp));
scanf("%d%d%d", &l, &r, &k);
for(int j = r; j >= l; j--){
if(p[j] >= k && !temp[a[j]]){
temp[a[j]] = 1;
for(int i = l; i <= j; i++){
if(a[i] == a[j]){
if((p[j] - p[i] + 1) == k) {
cnt++;
}
break;
}
}
}
}
printf("%d\n", cnt);
}
return 0;
}
通过40%(超时)