哈尔滨工程大学ACM预热赛

https://ac.nowcoder.com/acm/contest/554#question

A

#include <bits/stdc++.h>
using namespace std; int N;
long long dp[][]; int main() {
scanf("%d", &N);
memset(dp, , sizeof(dp));
dp[][] = , dp[][] = ;
for(int i = ; i <= N; i ++) {
for(int j = ; j <= i; j ++) {
for(int k = ; k <= j && k <= i - ; k ++) {
dp[i][j] += dp[i - ][k];
}
}
}
long long ans = ;
for(int i = ; i <= N; i ++)
ans += dp[N][i];
printf("%lld\n", ans - );
return ;
}

dp (long long 爆掉了)

#include <bits/stdc++.h>
using namespace std; string catalan[]= {
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""
};
int main() {
int N;
scanf("%d", &N);
cout << catalan[N] << endl;
return ;
}

(下面的 code 是正解 卡特兰数打表)

B

#include <bits/stdc++.h>
using namespace std; int T;
int a[][], b[][]; int main() {
scanf("%d", &T);
while(T --){
for(int i = ; i <= ; i ++) {
for(int j = ; j <= ; j ++)
scanf("%d", &a[i][j]);
} for(int i = ; i <= ; i ++) {
for(int j = ; j <= ; j ++)
b[j][i] = a[i][j];
} long long ans = b[][] * b[][] * b[][] +
b[][] * b[][] * b[][] +
b[][] * b[][] * b[][] -
b[][] * b[][] * b[][] -
b[][] * b[][] * b[][] -
b[][] * b[][] * b[][]; printf("%lld\n", abs(ans * ans));
}
return ;
}

还要查一下什么是伴随矩阵 线代已经学完一年了呀

C

#include <bits/stdc++.h>
using namespace std; int T;
long long a, N, b; long long Pow(long long a, long long b, long long mod) {
long long ans = ;
a %= mod;
while(b) {
if(b % ) {
ans = (ans * a) % mod;
b --;
} else {
a = (a * a) % mod;
b /= ;
}
}
return ans % mod;
} int main() {
scanf("%d", &T);
while(T --) {
scanf("%lld%d%lld", &a, &N, &b);
long long cnt = Pow(a, N, b);
printf("%lld\n", cnt % b);
}
return ;
}

一个快速幂对 b 取 mod

H

#include <bits/stdc++.h>
using namespace std; const int maxn = 2e6 + ;
int sum[maxn], a[maxn];
int T, N; int main() {
for(int i = ; i <= 1e6; i ++) {
for(int j = i; j <= 1e6; j += i)
a[j] = !a[j];
} for(int i = ; i <= 1e6; i ++) {
if(a[i]) sum[i] = sum[i - ] + ;
else sum[i] = sum[i - ];
} scanf("%d", &T);
while(T --) {
int x, y;
scanf("%d%d%d", &N, &x, &y);
printf("%d\n", sum[y] - sum[x - ]);
}
return ;
}

先离线处理一下 然后每次查询求一下前缀和

前一阵心情很差劲呀 休息一阵之后发现真的不能停下来 脑子明显锈住了 这几天多动动脑子活过来吧!天梯赛的题目代码过两天贴上来吧 还有半个月省赛 要加油呢 明天雷火的笔试希望有好运气

就算是深夜也有人乘着阳光呢 

上一篇:how-to-install-hyper-v-on-a-virtual-machine-in-hyper-v.aspx


下一篇:hellocharts-android开源图表库(效果非常好)