裁纸刀
#include<iostream>
using namespace std;
const int n = 20, m = 22;
int main(){cout << 4 + (n - 1) + n * (m - 1);//443return 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%(超时)