T1一元三次方程求解:
首先,本题可以暴力,但不稳定
那么正解如何做呢
首先,这题说根与根差值绝对值大于1,那么,枚举区间,对区间进行二分查找,然后
没了
代码:
#include<bits/stdc++.h>
using namespace std;
double a,b,c,d;
double fc(double x)
{
return a*x*x*x+b*x*x+c*x+d;
}
int main()
{
double l,r,m,x1,x2;
int s=0,i;
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
for (i=-100;i<100;i++)
{
l=i;
r=i+1;
x1=fc(l);
x2=fc(r);
if(!x1)
{
printf("%.2lf ",l);
s++;
}
if(x1*x2<0)
{
while(r-l>=0.001)
{
m=(l+r)/2;
if(fc(m)*fc(r)<=0)
l=m;
else
r=m;
}
printf("%.2lf ",r);
s++;
}
if (s==3)
break;
}
return 0;
}
T2循环比赛日程表:
这题很有意思啊
1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 5 6
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 2 1 4 3
7 8 5 6 3 4 1 2
8 7 6 5 4 3 2 1
经过细细观察,就未见其全图可以发现
1 2 3 4 | 5 6 7 8
2 1 4 3 | 6 5 8 7
3 4 1 2 | 7 8 5 6
4 3 2 1 | 8 7 6 5
————————
5 6 7 8 | 1 2 3 4
6 5 8 7 | 2 1 4 3
7 8 5 6 | 3 4 1 2
8 7 6 5 | 4 3 2 1
这个矩阵可以分割为这样的四部分
而每个小矩阵又可以分别分割
最后递归至一个单位
于是就可以发现
每个左上矩阵和右下矩阵一模一样
而左下与右上加了个奇怪的数
而这个数,显然:2k,而k,显然是从最小的矩阵开始,扩大k+1次中的k
那么就能写出来了,一个小递归,一个小式子
代码:
#include <bits/stdc++.h>
using namespace std;
int m, n, a[10005][10005];
void dfs(int now, int num, int x, int y) {
if (!now) {
a[x][y] = num;
return;
}
dfs(now - 1, num, x, y);
dfs(now - 1, num + (1 << (now - 1)), x, y + (1 << (now - 1)));
dfs(now - 1, num + (1 << (now - 1)), x + (1 << (now - 1)), y);
dfs(now - 1, num, x + (1 << (now - 1)), y + (1 << (now - 1)));
}
int main() {
scanf("%d", &m);
n = pow(2, m);
dfs(m, 1, 1, 1);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
T3取余运算
快速幂+取模,不再赘言
代码:
#include <bits/stdc++.h>
using namespace std;
long long b, p, k;
long long qpow(long long a, long long b) {
long long res = 1;
while (b) {
if (b & 1)
res = res * a % k;
a = a * a % k;
b >>= 1;
}
return res % k;
}
int main() {
scanf("%lld%lld%lld", &b, &p, &k);
printf("%lld^%lld mod %lld=%lld", b, p, k, qpow(b, p) % k);
return 0;
}
T4黑白棋子的移动
观察规律,打表,不再赘言
代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
scanf("%d", &n);
for (int i = 0; i < 2 * (n - 1) - 4; i++) {
printf("step%2d:", i);
if (!(i % 2)) {
for (int j = 1; j <= n - (ceil(i / 2)); j++) printf("o");
for (int j = 1; j <= n - (ceil(i / 2)); j++) printf("*");
printf("--");
for (int j = 1; j <= ceil(i / 2); j++) printf("o*");
} else if (i % 2) {
for (int j = 1; j <= n - 1 - (ceil(i / 2)); j++) printf("o");
printf("--");
for (int j = 1; j <= n - 1 - (ceil(i / 2)); j++) printf("*");
for (int j = 1; j <= ceil(i / 2); j++) printf("o*");
printf("o*");
}
printf("\n");
}
printf("step%2d:ooo*o**--", 2 * (n - 1) - 4);
for (int i = 1; i <= n - 4; i++) printf("*o");
printf("*\n");
printf("step%2d:o--*o**oo", 2 * (n - 1) - 3);
for (int i = 1; i <= n - 4; i++) printf("*o");
printf("*\n");
printf("step%2d:o*o*o*--o", 2 * (n - 1) - 2);
for (int i = 1; i <= n - 4; i++) printf("*o");
printf("*\n");
printf("step%2d:--o*o*o*o", 2 * (n - 1) - 1);
for (int i = 1; i <= n - 4; i++) printf("*o");
printf("*\n");
return 0;
}