【kuangbin带你飞】专题 【数学训练一】

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(CxN)=Nx2+Cx(开口向下)

那么在对称轴处去该函数的最大值:
x = − b 2 a = C 2 N x = \frac{-b}{2a} = \frac{C}{2N} x=2ab=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)=(L2x)×(W2x)×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=2abb24ac 时, 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; 
}

猜你喜欢

转载自blog.csdn.net/m0_46272108/article/details/109734008