最后的编程和最后的填空不做了,献祭
我只是自己做完了,填空没对答案
A
#pragma GCC optimize(3)
#pragma GCC optimize("inline") // 如果比赛允许开编译器优化的话,可以默写这两段
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <unordered_map>
#define pb push_back
#define fi first
#define se second
#define int long long
#define debug 1
#define out if(debug)
#define ex exit(0);
#define fso ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define db double
using namespace std;
typedef pair<int, int> PII;
//typedef long long LL;
const int N = 1e6+10;
const double pi = acos(-1) ;
const int mod = 100000 ;
signed main()
{
fso
int res = 1 ;
for(int i = 2021 ; i >= 1 ; i -=2)
{
res = res * i % mod ;
}
cout << res << endl;
return 0 ;
}
答案是 59375
B
#pragma GCC optimize(3)
#pragma GCC optimize("inline") // 如果比赛允许开编译器优化的话,可以默写这两段
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <unordered_map>
#define pb push_back
#define fi first
#define se second
#define int long long
#define debug 1
#define out if(debug)
#define ex exit(0);
#define fso ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define db double
using namespace std;
typedef pair<int, int> PII;
//typedef long long LL;
const int N = 1e6+10;
const double pi = acos(-1) ;
signed main()
{
fso
int res = 0 ;
for(int i = 1 ; i <= 2030 ; i ++ )
{
for(int j = 1 ; j <= 2030 ; j ++ )
{
if(i * j <= 2021) res ++ ;
}
}
cout << res << endl;
return 0 ;
}
答案是 15698
C
#pragma GCC optimize(3)
#pragma GCC optimize("inline") // 如果比赛允许开编译器优化的话,可以默写这两段
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <unordered_map>
#define pb push_back
#define fi first
#define se second
#define int long long
#define debug 1
#define out if(debug)
#define ex exit(0);
#define fso ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define db double
using namespace std;
typedef pair<int, int> PII;
const int N = 2100;
const double pi = acos(-1) ;
int f[N][6] ;
// 记忆化搜索
// int dfs(int n , int k )
// {
// if(f[n][k] != -1) return f[n][k] ;
// if(!k)
// {
// if(!n) return 1 ; // f[0][0] = 1 , 方案合法
// else return 0 ; // f[0][n] , n 非零 , 方案非法
// }
// f[n][k] = 0 ; // 先清空
// for(int i = 1 ; i <= n ; i ++ )
// f[n][k] += dfs(n-i , k-1) ;
// return f[n][k] ;
// }
// signed main()
// {
// fso
// memset(f, -1, sizeof f);
// cout << dfs(2021,5) << endl;
// return 0 ;
// }
// 递推
signed main()
{
fso
f[0][0] = 1 ;
for(int i = 1 ; i <= 2021 ; i ++ )
{
for(int j = 1 ; j <= 5 ; j ++)
{
if(i >= j)
for(int k = 1 ; k <= i ; k ++ )
{
f[i][j] += f[i-k][j-1] ;
}
}
}
cout << f[2021][5] << endl;
return 0 ;
}
答案是 691677274345
D
#pragma GCC optimize(3)
#pragma GCC optimize("inline") // 如果比赛允许开编译器优化的话,可以默写这两段
#include <iostream>
#include <cstring>
#include <algorithm>
#define pb push_back
#define fi first
#define se second
#define debug 0
#define int long long
#define out if(debug)
#define ex exit(0);
#define fso ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef pair<int, int> PII;
//typedef long long LL;
const int N = 2025 ;
int cost[N][N] ;
int cal(int i , int j)
{
int res = 0 ;
int q_i = i / 1000 ;
int q_j = j / 1000 ;
if(q_i != q_j)
res += q_i + q_j ;
int b_i = i % 1000 / 100 ;
int b_j = j % 1000 / 100 ;
if(b_i != b_j)
res += b_i + b_j ;
int s_i = i % 100 / 10 ;
int s_j = j % 100 / 10 ;
if(s_i != s_j)
res += s_i + s_j ;
int g_i = i % 10 ;
int g_j = j % 10 ;
if(g_i != g_j)
res += g_i + g_j ;
return res ;
}
struct Edge
{
int a , b , w ;
bool operator < (const Edge &W) const
{
return w < W.w ;
}
}e[N*N] ;
int p[N] ;
int find(int x) // 并查集
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int cnt ;
signed main()
{
fso
for(int i = 1 ; i < N ; i ++ ) p[i] = i ;
for(int i = 1 ; i <= 2021 ; i ++ )
{
for(int j = i ; j <= 2021 ; j ++ )
{
cost[i][j] = cal(i,j) ;
cost[j][i] = cost[i][j] ;
}
}
for(int i = 1 ; i <= 2021; i ++ )
{
for(int j = i + 1 ; j <= 2021 ;j ++ )
{
e[cnt].a = i ;
e[cnt].b = j ;
e[cnt].w = cost[i][j] ;
cnt ++ ;
}
}
sort(e,e+cnt) ;
int res = 0 ;
int bridge = 0 ;
for(int i = 0 ; i < cnt; i ++ )
{
auto t = e[i] ;
int a = t.a ;
int b = t.b ;
int w = t.w ;
a = find(a) , b = find(b) ;
if(a != b)
{
p[a] = b ;
res += w ;
bridge ++ ;
if(bridge == 2020) break ;
}
}
cout << res << endl;
return 0 ;
}
答案是 4046
编程的题面不显示了,在杂题选讲可见
F
#pragma GCC optimize(3)
#pragma GCC optimize("inline") // 如果比赛允许开编译器优化的话,可以默写这两段
#include <iostream>
#include <cstring>
#include <algorithm>
#define pb push_back
#define fi first
#define se second
#define debug 0
#define int long long
#define out if(debug)
#define fso ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef pair<int, int> PII;
//typedef long long LL;
int n ;
double cp ;
int qmi(int a , int b)
{
int res = 1 ;
while(b)
{
if(b&1) res = res * a ;
a = a * a ;
b >>= 1 ;
}
return res ;
}
bool check(int x)
{
double p = qmi(x,2) % n ;
return p < cp ;
}
signed main()
{
fso
cin >> n ;
cp = n*1.0 / 2 ;
int res = 0 ;
for(int i = 1 ; i < n ; i ++ )
{
if(check(i)) res ++ ;
}
cout << res << endl;
}
G
#pragma GCC optimize(3)
#pragma GCC optimize("inline") // 如果比赛允许开编译器优化的话,可以默写这两段
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#define pb push_back
#define fi first
#define se second
#define debug 0
#define int long long
#define out if(debug)
#define fso ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef pair<int, int> PII;
//typedef long long LL;
int n ;
int res= 1;
void pf()
{
for(int i = 2 ; i < n / i ; i ++ )
{
if(n % i == 0)
{
int s = 0 ;
while(n % i == 0) s ++ , n /= i ;
if(s%2)
{
res *= i ;
}
}
}
if(n > 1) res *= n ;
}
signed main()
{
fso
cin >> n ;
if((int)sqrt(n) * (int)sqrt(n) == n )
{
cout << 1 << endl;
return 0 ;
}
pf() ;
cout << res << endl;
}
H
#pragma GCC optimize(3)
#pragma GCC optimize("inline") // 如果比赛允许开编译器优化的话,可以默写这两段
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#define pb push_back
#define fi first
#define se second
#define debug 1
#define int long long
#define out if(debug)
#define ex exit(0);
#define fso ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef pair<int, int> PII;
typedef pair<int, PII> PIII;
//typedef long long LL;
const int N = 2e5+10 ;
int n , m ;
int remain[N];
int cnt = 1 ;
struct
{
int a , b , c , d ;
}task[N] ;
priority_queue<PIII , vector<PIII> ,greater<PIII>> q ; // 存储运行的任务
vector<int> T ;
signed main()
{
cin >> n >> m ;
for(int i = 1 ; i <= n ; i++)
{
scanf("%lld", &remain[i]);
}
for(int i = 1; i <= m ; i ++) // 存储这些task
{
scanf("%lld%lld%lld%lld" , &task[i].a,&task[i].b,&task[i].c,&task[i].d) ;
T.pb(task[i].a) ;
T.pb(task[i].a+task[i].c) ;
}
sort(T.begin() , T.end()) ;
for(int xs = 0 , t = T[xs] ; xs < T.size(); ) // 从第一个时间片开始枚举,一直到最后一个任务分配
{
// out cout << t << endl;
// 任务下线
while(q.size()&&q.top().fi == t) // 释放任务
{
auto tmp = q.top() ;
q.pop() ;
remain[tmp.se.fi] += tmp.se.se ; // 归还算力
}
// 任务上线
if(task[cnt].a == t) // 说明cnt这个任务会被在t时刻进行分配
{
// 检验是否可以被分配
int id = task[cnt].b ;
int require_t = task[cnt].c ;
int require_cal = task[cnt].d ;
if(remain[id] >= require_cal) // 剩余算力大于要求算力,说明可以被分配
{
remain[id] -= require_cal ; // 分配
q.push({t+require_t , {id,require_cal}}); // 下线时间,结点编号,吃掉的算力
printf("%lld\n",remain[id]) ;
}else
{
puts("-1") ;
}
cnt ++ ;
}
t = T[++xs] ;
}
return 0 ;
}
I
#pragma GCC optimize(3)
#pragma GCC optimize("inline") // 如果比赛允许开编译器优化的话,可以默写这两段
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#define pb push_back
#define fi first
#define se second
#define debug 1
#define int long long
#define out if(debug)
#define ex exit(0);
#define fso ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef pair<int, int> PII;
//typedef long long LL;
const int N = 110 , M = 1 << 6 , K = 21, mod = 1e9+7;
int n , m , k ;
int f[N][M][M][K] ;
inline int lowbit(int x) // 返回末尾的1
{
return x & -x;
}
int get_one(int x)
{
int res = 0 ;
while(x)
{
res ++ ;
x -= lowbit(x) ;
}
return res ;
}
signed main()
{
fso
cin >> n >> m >> k ;
f[0][0][0][0] = 1 ;
for(int i = 1 ; i <= m ; i ++ )
{
for(int a = 0 ; a < 1 << n ; a ++ ) // 上两行
{
for(int b = 0 ; b < 1 << n ; b ++ ) // 上一行
{
if (a & (b << 2) || b & (a << 2)) continue;
for(int c = 0 ; c < 1 << n ; c ++ )
{
if (c & (b << 2) || b & (c << 2)) continue;
if (c & (a << 1) || a & (c << 1)) continue;
int one = get_one(c) ;
for(int h = one ; h <= k ; h ++ )
{
f[i][b][c][h] = (f[i][b][c][h] + f[i-1][a][b][h-one]) % mod;
}
}
}
}
}
int res = 0 ;
for(int a = 0 ; a < 1 <<n ; a ++ )
{
for(int b = 0 ; b < 1 << n ; b ++ )
{
res =( res + f[m][a][b][k]) %mod ;
}
}
cout << res << endl;
return 0 ;
}