【kuangbin带你飞】专题 【数学训练一】
- LightOJ - 1008 Fibsieve`s Fantabulous Birthday
- LightOJ - 1010 Knights in Chessboard
- LightOJ - 1020 A Childhood Game (巴什博弈)~
- LightOJ - 1078 Integer Divisibility ~
- LightOJ - 1116 Ekka Dokka ~
- LightOJ - 1148 Mad Counting
- LightOJ - 1179 Josephus Problem (约瑟夫环)~
- LightOJ - 1275 Internet Service Providers (一元二次函数求最大值的横坐标)~
- LightOJ - 1294 Positive Negative Sign (规律)~
- LightOJ - 1297 Largest Box (一元三次方程求最值)~
- LightOJ - 1311 Unlucky Bird (物理题)~
- LightOJ - 1323 Billiard Balls
- LightOJ - 1349 Aladdin and the Optimal Invitation
- LightOJ - 1354 IP Checking
- LightOJ - 1369 Answering Queries
- LightOJ - 1410 Consistent Verdicts
- LightOJ - 1414 February 29
- LightOJ - 1430 A Question of Time
- LightOJ - 1024 Eid
- LightOJ - 1319 Monkey Tradition (中国剩余定理模板题)~
LightOJ - 1008 Fibsieve`s Fantabulous Birthday
LightOJ - 1010 Knights in Chessboard
LightOJ - 1020 A Childhood Game (巴什博弈)~
题意:
Alice 和 Bob一开始都知道弹珠的数量。现在任何人都可以开始游戏。但是获胜的条件取决于谁先开始。如果爱丽丝先开始,那么拿走最后一个弹珠的玩家输掉游戏。如果Bob先开始,那么拿走最后一个弹珠的玩家获胜。现在你知道了弹珠的初始数量和最先出场的玩家的名字。然后你必须找到游戏的赢家,如果他们都玩得最优。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define ll long long
#define int ll
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define MOD 1e9 + 7
using namespace std;
int read()
{
int w = 1, s = 0;
char ch = getchar();
while (ch < '0' || ch>'9') { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0';ch = getchar(); }
return s * w;
}
//最大公约数
int gcd(int x,int y) {
if(x<y) swap(x,y);//很多人会遗忘,大数在前小数在后
//递归终止条件千万不要漏了,辗转相除法
return x % y ? gcd(y, x % y) : y;
}
//计算x和y的最小公倍数
int lcm(int x,int y) {
return x * y / gcd(x, y);//使用公式
}
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
//------------------------ 以上是我常用模板与刷题几乎无关 ------------------------//
signed main()
{
int t = read();
int n;
int kase = 0;
string str;
while(t--) {
cin >> n >> str;
printf("Case %lld: ", ++kase);
if(str[0] == 'A') {
if(n % 3 == 1) printf("Bob\n");
else printf("Alice\n");
} else {
if(n % 3) printf("Bob\n");
else printf("Alice\n");
}
}
return 0;
}
LightOJ - 1078 Integer Divisibility ~
题意:
给你一个数
n
n
n,一个数
m
m
m,你需要找到一个
k
k
k,
表示
k
k
k 个
n
n
n 组成的数字可以被
m
m
m 整除。
例如给你
1
1
1 和
3
3
3,那么
111
111
111 可以被
3
3
3 整除,所以
k
k
k 为
3
3
3.
Input
输入一个
T
<
=
300
T <= 300
T<=300,代表样例数。
每个样例会给你两个数
m
m
m(需要除的数)和
n
n
n(代表数字由
n
n
n 组成)。
Output
对于每种情况,打印案例编号和此倍数的位数。
如果有几种解决方案;输出最小的一个。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define ll long long
#define int ll
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define MOD 1e9 + 7
using namespace std;
int read()
{
int w = 1, s = 0;
char ch = getchar();
while (ch < '0' || ch>'9') { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0';ch = getchar(); }
return s * w;
}
//最大公约数
int gcd(int x,int y) {
if(x<y) swap(x,y);//很多人会遗忘,大数在前小数在后
//递归终止条件千万不要漏了,辗转相除法
return x % y ? gcd(y, x % y) : y;
}
//计算x和y的最小公倍数
int lcm(int x,int y) {
return x * y / gcd(x, y);//使用公式
}
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
//------------------------ 以上是我常用模板与刷题几乎无关 ------------------------//
signed main()
{
int t = read();
int kase = 0;
while(t--) {
int m = read(), n = read();//m需要除的数,n数字由n组成
int r = n % m;//余数
int cnt = 1;
while (r) {
r = (r * 10 + n) % m;//需要除的数
cnt++;
}
printf("Case %lld: ", ++kase);
printf("%lld\n", cnt);
}
return 0;
}
LightOJ - 1116 Ekka Dokka ~
输入一个
w
w
w,问能否分解为:奇数 × 偶数,如果不能就是
i
m
p
o
s
s
i
b
l
e
impossible
impossible,否则输出偶数最小的答案。(奇数不可能分解为:奇数 × 偶数)
偶数最小的答案:while (w % 2 == 0) w /= 2;
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define ll long long
#define int ll
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define MOD 1e9 + 7
using namespace std;
int read()
{
int w = 1, s = 0;
char ch = getchar();
while (ch < '0' || ch>'9') { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0';ch = getchar(); }
return s * w;
}
//最大公约数
int gcd(int x,int y) {
if(x<y) swap(x,y);//很多人会遗忘,大数在前小数在后
//递归终止条件千万不要漏了,辗转相除法
return x % y ? gcd(y, x % y) : y;
}
//计算x和y的最小公倍数
int lcm(int x,int y) {
return x * y / gcd(x, y);//使用公式
}
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
//------------------------ 以上是我常用模板与刷题几乎无关 ------------------------//
signed main()
{
int t = read();
int kase = 0;
while (t--) {
int w = read();
if (w & 1) printf("Case %lld: Impossible\n", ++kase);
else {
int tmp = w;
while (w % 2 == 0) w /= 2;
printf("Case %lld: %lld %lld\n", ++kase, w, tmp / w);
}
}
return 0;
}
LightOJ - 1148 Mad Counting
LightOJ - 1179 Josephus Problem (约瑟夫环)~
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define ll long long
#define int ll
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define MOD 1e9 + 7
using namespace std;
int read()
{
int w = 1, s = 0;
char ch = getchar();
while (ch < '0' || ch>'9') { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0';ch = getchar(); }
return s * w;
}
//最大公约数
int gcd(int x,int y) {
if(x<y) swap(x,y);//很多人会遗忘,大数在前小数在后
//递归终止条件千万不要漏了,辗转相除法
return x % y ? gcd(y, x % y) : y;
}
//计算x和y的最小公倍数
int lcm(int x,int y) {
return x * y / gcd(x, y);//使用公式
}
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
//------------------------ 以上是我常用模板与刷题几乎无关 ------------------------//
signed main()
{
int t = read();
int kase = 0;
while (t--) {
int n = read(), k = read();
int ans = 0;
for (int i = 2; i <= n; ++i) ans = (ans + k) % i;
printf("Case %lld: ", ++kase);
printf("%lld\n", ans + 1);
}
return 0;
}
LightOJ - 1275 Internet Service Providers (一元二次函数求最大值的横坐标)~
题意:求一元二次函数求最大值的横坐标
y
(
x
)
=
x
(
C
−
x
∗
N
)
=
−
N
x
2
+
C
x
y(x) = x(C - x*N) = -Nx^2 + Cx
y(x)=x(C−x∗N)=−Nx2+Cx(开口向下)
那么在对称轴处去该函数的最大值:
当
x
=
−
b
2
a
=
C
2
N
x = \frac{-b}{2a} = \frac{C}{2N}
x=2a−b=2NC 时,
y
(
x
)
y(x)
y(x) 取最大值
因为
x
x
x 是取整的,所以要跟
x
+
1
x + 1
x+1 比一下对应函数值的大小。
注意本题最后输出的是:一元二次函数求最大值的 横坐标
(有个朋友一直在求最大值,竟然怀疑题目有问题)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define ll long long
#define int ll
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define MOD 1e9 + 7
using namespace std;
int read()
{
int w = 1, s = 0;
char ch = getchar();
while (ch < '0' || ch>'9') { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0';ch = getchar(); }
return s * w;
}
//最大公约数
int gcd(int x,int y) {
if(x<y) swap(x,y);//很多人会遗忘,大数在前小数在后
//递归终止条件千万不要漏了,辗转相除法
return x % y ? gcd(y, x % y) : y;
}
//计算x和y的最小公倍数
int lcm(int x,int y) {
return x * y / gcd(x, y);//使用公式
}
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
//------------------------ 以上是我常用模板与刷题几乎无关 ------------------------//
signed main()
{
int t = read();
int kase = 0;
while (t--) {
int n = read(), c = read();
printf("Case %lld: ", ++kase);
if (n == 0) {
printf("0\n");
continue;
}
int x = (c / n) / 2;
if (x * (c - x * n) >= (x + 1) * (c - (x + 1) * n)) printf("%lld\n", x);
else printf("%lld\n", x + 1);
}
return 0;
}
LightOJ - 1294 Positive Negative Sign (规律)~
题意:有
n
n
n 个数,并且
1
.
.
.
m
1 \;...\; m
1...m 是负的 ,
(
m
+
1
)
.
.
.
2
m
(m + 1) \;... \;2m
(m+1)...2m 是正的 以此类推…
问前n个数的和是多少。
通过找规律可以得出: s u m = ∑ i = 1 n = n × m 2 sum = \sum_{i=1}^n = \frac{n × m}{2} sum=∑i=1n=2n×m.
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define ll long long
#define int ll
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define MOD 1e9 + 7
using namespace std;
int read()
{
int w = 1, s = 0;
char ch = getchar();
while (ch < '0' || ch>'9') { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0';ch = getchar(); }
return s * w;
}
//最大公约数
int gcd(int x,int y) {
if(x<y) swap(x,y);//很多人会遗忘,大数在前小数在后
//递归终止条件千万不要漏了,辗转相除法
return x % y ? gcd(y, x % y) : y;
}
//计算x和y的最小公倍数
int lcm(int x,int y) {
return x * y / gcd(x, y);//使用公式
}
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
//------------------------ 以上是我常用模板与刷题几乎无关 ------------------------//
map<int, int>mp;
signed main()
{
int t = read();
int kase = 0;
while (t--) {
int n = read(), m = read();
int sum = 0;
printf("Case %lld: ", ++kase);
sum = n / 2 * m;
printf("%lld\n", sum);
}
return 0;
}
LightOJ - 1297 Largest Box (一元三次方程求最值)~
题意: V ( x ) = ( L − 2 x ) × ( W − 2 x ) × x V(x) = (L - 2x) × (W - 2x) × x V(x)=(L−2x)×(W−2x)×x 其中 x x x 是自变量,求 V ( x ) m a x V(x)_{max} V(x)max。
化简得: V ( x ) = 4 x 3 − ( 2 L + 2 W ) x 2 + L W x V(x) = 4x^3 - (2L+2W)x^2 + LWx V(x)=4x3−(2L+2W)x2+LWx
当 x = − b − b 2 − 4 a c 2 a x = \frac{-b-\sqrt{b^2-4ac}}{2a} x=2a−b−b2−4ac时, V ( x ) V(x) V(x) 取最大值,即 x = 4 × ( l + w ) − 16 × ( l + w ) × ( l + w ) − 4 × 12 × l × w 24.0 x = \frac{4 × (l + w) - \sqrt{16 × (l + w) × (l + w) - 4 × 12 × l × w}}{24.0} x=24.04×(l+w)−16×(l+w)×(l+w)−4×12×l×w
三次函数求最大值: V ( x ) m a x = V ( 4 × ( l + w ) − 16 × ( l + w ) × ( l + w ) − 4 × 12 × l × w 24.0 ) V(x)_{max} = V(\frac{4 × (l + w) - \sqrt{16 × (l + w) × (l + w) - 4 × 12 × l × w}}{24.0}) V(x)max=V(24.04×(l+w)−16×(l+w)×(l+w)−4×12×l×w)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define ll long long
#define int ll
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define MOD 1e9 + 7
using namespace std;
int read()
{
int w = 1, s = 0;
char ch = getchar();
while (ch < '0' || ch>'9') { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0';ch = getchar(); }
return s * w;
}
//最大公约数
int gcd(int x,int y) {
if(x<y) swap(x,y);//很多人会遗忘,大数在前小数在后
//递归终止条件千万不要漏了,辗转相除法
return x % y ? gcd(y, x % y) : y;
}
//计算x和y的最小公倍数
int lcm(int x,int y) {
return x * y / gcd(x, y);//使用公式
}
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
//------------------------ 以上是我常用模板与刷题几乎无关 ------------------------//
double l, w;
double f(double x) {
return x * (l - 2 * x) * (w - 2 * x);
}
signed main()
{
int t = read();
int kase = 0;
while (t--) {
scanf("%lf%lf", &l, &w);
double x = (4 * (l + w) - sqrt(16 * (l + w) * (l + w) - 4 * 12 * l * w)) / 24.0;
printf("Case %lld: %lf\n", ++kase, f(x));
}
return 0;
}
LightOJ - 1311 Unlucky Bird (物理题)~
物理公式: x = v t 2 x = \frac{vt}{2} x=2vt 匀变速直线运动,路程 = 平均速度 × 时间
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define ll long long
#define int ll
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define MOD 1e9 + 7
using namespace std;
int read()
{
int w = 1, s = 0;
char ch = getchar();
while (ch < '0' || ch>'9') { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0';ch = getchar(); }
return s * w;
}
//最大公约数
int gcd(int x,int y) {
if(x<y) swap(x,y);//很多人会遗忘,大数在前小数在后
//递归终止条件千万不要漏了,辗转相除法
return x % y ? gcd(y, x % y) : y;
}
//计算x和y的最小公倍数
int lcm(int x,int y) {
return x * y / gcd(x, y);//使用公式
}
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
//------------------------ 以上是我常用模板与刷题几乎无关 ------------------------//
double l, w;
double f(double x) {
return x * (l - 2 * x) * (w - 2 * x);
}
signed main()
{
int t = read();
int kase = 0;
while (t--) {
double v1, v2, v3, a1, a2;
cin >> v1 >> v2 >> v3 >> a1 >> a2;
double x = v1 * (1 / 2.0) * v1 / a1 * (1.0) + v2 * (1 / 2.0) * v2 / a2 * (1.0);
printf("Case %lld: %lf %lf\n", ++kase, x, v3 * max(v1 / a1, v2 / a2));
}
return 0;
}
LightOJ - 1323 Billiard Balls
LightOJ - 1349 Aladdin and the Optimal Invitation
LightOJ - 1354 IP Checking
LightOJ - 1369 Answering Queries
LightOJ - 1410 Consistent Verdicts
LightOJ - 1414 February 29
LightOJ - 1430 A Question of Time
LightOJ - 1024 Eid
LightOJ - 1319 Monkey Tradition (中国剩余定理模板题)~
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define ll long long
#define int ll
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define MOD 1e9 + 7
using namespace std;
int read()
{
int w = 1, s = 0;
char ch = getchar();
while (ch < '0' || ch>'9') { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0';ch = getchar(); }
return s * w;
}
//最大公约数
int gcd(int x,int y) {
if(x<y) swap(x,y);//很多人会遗忘,大数在前小数在后
//递归终止条件千万不要漏了,辗转相除法
return x % y ? gcd(y, x % y) : y;
}
//计算x和y的最小公倍数
int lcm(int x,int y) {
return x * y / gcd(x, y);//使用公式
}
int ksm(int a, int b, int mod) { int s = 1; while(b) {if(b&1) s=s*a%mod;a=a*a%mod;b>>=1;}return s;}
//------------------------ 以上是我常用模板与刷题几乎无关 ------------------------//
const int N = 20;
int p[N], r[N];
int x, y;
// 求x, y,使得ax + by = gcd(a, b)
int exgcd(int a, int b, int &x, int &y)
{
if (b == 0) {
x = 1; y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
signed main()
{
int t = read();
int kase = 0;
while (t--) {
int n = read();
int m = 1;
for (int i = 1; i <= n; ++i) {
p[i] = read(), r[i] = read();
m *= p[i];
}
int ans = 0;
for (int i = 1; i <= n; ++i) {
int a = m / p[i];
int tmp = exgcd(a, p[i], x, y);
ans = (ans + r[i] * a * x) % m;
}
printf("Case %lld: %lld\n", ++kase, (ans % m + m) % m);
}
return 0;
}