我写了那些题目:

https://codeforc.es/problemset/problem/1366/D
Two Divisors
这个题目乍一看很难,是个猜测规律的题,实际是可以严格的数学证明
问d1和d2是ans的两个约数,你可以选择两个非1的约数------gcd(d1+d2,ans)
有一个公式,gcd(d1+d2,d1*d2),这样一来就可以了,d1随便找的质数,分解起来,d1*d2就是ans了,可惜想不到啊
gcd本质上是质数的手段,暂时先这样推测吧。。。
代码如下
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 2e5+111;
const int Maxn = 1e7+11;
int prime[Maxn];
int Mark[Maxn + 1];
int sieve() {
int p = 0;
Mark[0] = 1; Mark[1] = 1;
for (int i = 2; i < Maxn; i++){
if (Mark[i] == 0) {
prime[p++] = i;
}
for (int j = 0; j < p && prime[j] * i < Maxn; j++){
Mark[i * prime[j]] = 1;
if (i % prime[j] == 0) {
break;
}
}
}
return p;
}
vector<int>a,b,c;
int main(){
int chal = sieve();
int t;
cin>>t;
for(int k=0;k<t;k++){
int x;
cin>>x;
if(!Mark[x]){
a.push_back(-1);
b.push_back(-1);
continue;
}
int ans = 0;
for(int i=0;i<1000 && prime[i] <= x;i++){
int p = prime[i];
if(x % p == 0){
ans = p;
while(x%p == 0){
x /= p;
}
break;
}
}
if(x > 1){
a.push_back(x);
b.push_back(ans);
}
else{
a.push_back(-1);
b.push_back(-1);
}
}
for(int i=0;i<a.size();i++){
cout<<a[i]<<" ";
}
cout<<endl;
for(int i=0;i<a.size();i++){
cout<<b[i]<<" ";
}
cout<<endl;
return 0;
}
https://codeforc.es/problemset/problem/1366/C
Palindromic Paths
这个题也很有趣,问你在01矩阵里,从左上角到右下角,走的路径的01串要求是回文的,问你最少反转几个01就可以。

可以发现圈住的地方步数是一样的,所以只要左上和右下比较一下就行。
#include<iostream>
using namespace std;
typedef long long ll;
int list[200][200];
int n,m;
int a[2000];
int b[2000];
int main(){
ll t;
cin>>t;
while(t--){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>list[i][j];
}
}
for(int i=0;i<n*m;i++){
a[i] = b[i] = 0;
}
int be = 0;
for(int i=0;i<n;i++){
be = i+1;
for(int j=0;j<m;j++){
if(list[i][j]) a[be]++;
else b[be]++;
be++;
}
}
int len = n+m-1;
int ans = 0;
for(int i=1;i<len/2 + 1;i++){
int x = i;
int y = len - i + 1;
ans += min(a[x] + a[y],b[y] + b[x]);
}
cout<<ans<<endl<<endl;
}
return 0;
}
https://codeforc.es/problemset/problem/1435/C
Perform Easily
又是原题打乱排序尺取,
#include<iostream>
#include<cstring>
#include<string>
#include<queue>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
const ll INF = 1e16;
const int maxn = 2e5+11;
set<int>ss;
struct Node {
ll val;
int id;
Node(ll a,int b) : val(a),id(b) {}
};
vector<Node>ins;
queue<Node>que;
int n;
int a[20];
ll list[maxn];
bool bml(Node a,Node b) {
return a.val < b.val;
}
int vis[maxn];
int main() {
for(int i=0; i<6; i++) {
cin>>a[i];
ss.insert(a[i]);
}
int len = ss.size();
cin>>n;
for(int i=0; i<n; i++) {
cin>>list[i];
}
for(int i=0; i<n; i++) {
for(int j=0; j<6; j++) {
ll x = list[i] - a[j];
if(x < 0) x = INF;
ins.push_back(Node(x,i));
}
}
sort(ins.begin(),ins.end(),bml);
int cnt = 0;
ll ans = INF;
for(int i=0; i<ins.size(); i++) {
Node a = ins[i];
if(vis[a.id] == 0) cnt++;
vis[a.id] ++;
que.push(a);
if(cnt == n){
while(que.size()){
Node aa = que.front();
que.pop();
ans = min(ins[i].val - aa.val,ans);
vis[aa.id]--;
if(vis[aa.id] == 0){
cnt--;
break;
}
}
}
}
cout<<ans<<endl;
return 0;
}
下周南京,我要拿奖,我能拿奖,我必定拿奖