整数与除数

同余方程(扩展欧几里得)

题目描述

求关于x的同余方程 ax≡1(modb) 的最小正整数解

输入格式

一行,包含两个正整数 a,b,用一个空格隔开。

输出格式

一个正整数 x0​,即最小正整数解。输入数据保证一定有解。

输入

3 10

输出

7

说明/提示

对于 40%的数据,2≤b≤1,000;

对于 60%的数据,2≤b≤50,000,000;

对于 100%的数据,2≤a,b≤2,000,000,000。

思路:

同余方程ax ≡ 1 (mod b),意思就是:求满足ax%b=1,1%b=1最小正整数解。

题目问的是满足ax mod b=1 的最小正整数 x。(a,b是正整数),暴力枚举 x,会超时。

把问题转化一下。观察 ax mod b=1,它的实质是 ax+by=1:这里 y 是我们新引入的某个整数,并且似乎是个负数才对。这样表示是为了用扩展欧几里得算法。我们将要努力求出一组 x,y 来满足这个等式。

扩展欧几里得是用来求 ax+by=gcd(a,b) 中的未知数的,怎么牵扯到等于 1 呢?

扩展欧几里德算法详解_zhj5chengfeng的博客-CSDN博客_扩展欧几里得算法扩展欧几里德算法    谁是欧几里德?自己百度去    先介绍什么叫做欧几里德算法    有两个数 a b,现在,我们要求 a b 的最大公约数,怎么求?枚举他们的因子?不现实,当 a b 很大的时候,枚举显得那么的naïve ,那怎么做?    欧几里德有个十分又用的定理: gcd(a, b) = gcd(b , a%b) ,这样,我们就可以在几乎是 log 的时间复杂度里求解出https://blog.csdn.net/zhjchengfeng5/article/details/7786595说实话,逆元,快速幂,,,这些数学都没系统学过,估计现在看只能记住几个结论,,,希望省赛没有这类题吧。(太笨了,呜呜呜~~~)

原理是,方程 ax+by=m 有解的必要条件是 m mod gcd(a,b)=0。

在这道题中,方程 ax+by=1 的有解的必要条件是 1 mod gcd(a,b)=0。gcd(a,b) 只能等于 1 ,实际上就是 a,b 互质

#include<iostream>
using namespace std;//同余方程
int a,b,x,y,tx;
void exgcd(int a,int b){//求解 ax + by = gcd(a, b) 这么一个方程if(b==0){x=1,y=0;return ;}exgcd(b,a%b);tx=x;x=y;y=tx-a/b*y;return ;
}
int main()
{cin>>a>>b;exgcd(a,b);cout<<(x+b)%b<<endl;return 0;
}

买不到的数目

题目描述

小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。

输入格式

两个正整数 a 和 b,它们之间用一个空格隔开,表示小凯中金币的面值。

输出格式

一个正整数 N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。

输入 

3 7

输出 

11

说明/提示

【输入输出样例  说明】

小凯手中有面值为 3 和 7 的金币无数个,在不找零的前提下无法准确支付价值为 1,2,4,5,8,11 的物品,其中最贵的物品价值为 11,比 11 贵的物品都能买到,比如:

12=3×4+7×0;13=3×2+7×1;14=3×0+7×2;15=3×5+7×0。

【数据范围与约定】

对于 30% 的数据: 1≤a,b≤50。

对于 60% 的数据: 1≤a,b≤10^4。

对于100% 的数据:1≤a,b≤10^9。

结论:互素的两个数啊a,b,通过倍加得不到的最大的数为:a*b-a-b

证明如下:

设 a<b,设答案为 x

若 x≡ma (mod b)(1≤m≤b−1)

即 x=ma+nb(1≤m≤b−1)

显然当 n<0(n取整数); 因此当 n=−1 时 x 取得最大值,此时 x=ma−b。

显然当 m 取得最大值 b−1 时 x 最大,此时 x=(b−1)a−b=ab−a−b 即证。

#include<iostream>
using namespace std;//买不到的数目(与包子凑数一类题)
long long a,b,ans=0;
int main()
{cin>>a>>b;ans=a*b-a-b;cout<<ans<<endl;return 0;
}

小凯的数字(数学)

题目描述

小凯有一天突发奇想,写下了一串数字:l(l+1)(l+2)...(r−1)r

例如:l=2,r=5时,数字为:2345

l=8,r=12时数字为 89101112

小凯很喜欢数字 9,所以他想问你他写下的数字除以 9 的余数是多少

例如:l=2,r=5时,2345 mod 9=5

输入格式

输入格式:

第一行为数字 Q,表示小凯有 Q 个问题

第 2 到 Q+1 行,每行两个数字 l,r 表示数字范围

输出格式

输出格式:

对于每行的问题输出一行,一个数字,表示小凯问题的回答

输入 #1

2
2 5
8 12

输出 #1

5
5

输入 #2

3
1 999
123 456
13579 24680

输出 #2

0
6
0

说明/提示

样例1解释:2345 mod 9=5   89101112 mod 9=5

30% 数据满足:Q≤10;l,r≤100

50% 数据满足:Q≤100;l,r≤10000

70% 数据满足:Q≤1000;l,r≤10^6

100%数据满足:Q≤10000;0<l,r≤10^12 且 l ≤ r.

数据大的吓人,肯定不是按照正常思维做的,,,模为9很小,,,

l,l+1,l+2,... ,r-1,r 去掉中间的逗号后,连在一起是一个巨大的数,但单看其中某一个数x

每个数的“贡献”为x*10^(n):而10^(n) mod 9 == 1,因此最后

这个巨大的数 mod 9== [(l+r)*(r-l+1)/2] mod 9;

由有:(x*y) mod k == (x mod k*y mod k) mod k;

注意:l,r,x,y 都要longlong型  O(1)

#include<iostream>
using namespace std;//小凯的数字
long long l,r,k=9,q;
int main()
{cin>>q;//问题数while(q--){long long x,y;cin>>l>>r;if((l+r)%2==0){//判断那个能被2整除x=(l+r)/2;y=(r-l+1);}else{x=(l+r);y=(r-l+1)/2;}cout<<(x%k*y%k)%k<<endl;}return 0;
}

组合数学与计数

栈(卡特兰数)

题目描述

宁宁考虑的是这样一个问题:一个操作数序列,1,2,…,n(图示为 1 到 3 的情况),栈 A 的深度大于 n。

现在可以进行两种操作,

  1. 将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的 push 操作)
  2. 将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的 pop 操作)

使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由 1 2 3 生成序列 2 3 1 的过程。

(原始状态如上图所示)

你的程序将对给定的 n,计算并输出由操作数序列 1,2,…,n 经过操作可能得到的输出序列的总数。

输入格式

输入文件只含一个整数 n(1≤n≤18)。

输出格式

输出文件只有一行,即可能输出序列的总数目。

输入 

3

输出 

5

卡特兰数 原理:

建立数组f:其中 f[i] 表示 i 个数的全部可能性。

f[0] = 1, f[1] = 1; 

设 x 为当前出栈序列的最后一个,则x有n种取值;

由于x是最后一个出栈的,所以可以将已经出栈的数分成两部分:①比x小 ;②比x大

比x小的数有x-1个,所以这些数的全部出栈可能为f[x-1];

比x大的数有n-x个,所以这些数的全部出栈可能为f[n-x];

这两部分互相影响,所以一个x的取值能够得到的所有可能性为f[x-1] * f[n-x];

另外,由于x有n个取值,所以 ans = f[0]*f[n-1] + f[1]*f[n-2] + ... + f[n-1]*f[0];

#include<iostream>
using namespace std;//栈(卡特兰数)
int main()
{int n,f[20]={0};cin>>n;f[0]=1,f[1]=1;for(int i=2;i<=n;i++)for(int j=0;j<i;j++)f[i]+=f[j]*f[i-j-1];//递推实现卡特兰数cout<<f[n]<<endl;
}

盒子与球(组合数学:斯特林数)

题目描述

现有 r 个互不相同的盒子和 n 个互不相同的球,要将这 n 个球放入 r 个盒子中,且不允许有空盒子。请求出有多少种不同的放法。

两种放法不同当且仅当存在一个球使得该球在两种放法中放入了不同的盒子。

输入格式

输入只有一行两个整数,分别代表 n 和 r。

输出格式

输出一行一个整数代表答案。

输入 

3 2

输出 

6

说明/提示

样例输入输出 1 解释

有两个盒子(编号为 1,2)和三个球(编号为 1,2,3),共有六种方案,分别如下:

盒子编号 方案 1 方案 2 方案 3 方案 4 方案 5 方案 6
盒子 1 小球 1 小球 2 小球 3 小球 2,3 小球 1,3 小球 1,2
盒子 2 小球 2,3 小球 1,3 小球 1,2 小球 1 小球 2 小球 3

数据规模与约定

对于 100% 的数据,保证 0≤r≤n≤10,且答案小于 2^31。

斯特林数_百度百科在组合数学,Stirling数可指两类数,第一类Stirling数和第二类Stirling数,都是由18世纪数学家James Stirling提出的。Stirling数有两种,第一类Stirling数和第二类Stirling数,它们自18世纪以来一直吸引许多数学家的兴趣,如欧拉、柯西、西尔沃斯特和凯莱等。后来哥本哈根(Copenhagen)大学的尼尔森(Niels Nielsen,1865-1931)提出了"Stirlingschen Zahlen erster Art" [第一类Stirling数]和"Stirlingschen Zahlen zweiter Art" [第二类Stirling数],首次把这两类数冠以「Stirling数」之名 。因为苏格兰数学家斯特林(J. Stirling, 1692-1770)首次发现这些数并说明了它们的重要性。https://baike.baidu.com/item/%E6%96%AF%E7%89%B9%E6%9E%97%E6%95%B0/4938529?fr=aladdin从百度中复制的:

(2)n个不同的球,放入m个有区别的盒子,不允许盒子为空。

方案数:m!*S(n,m)。因盒子有区别,乘上盒子的排列即可。

第二类Stirling数从定义出发:要把n+1个元素分成m个集合则分析如下:(此时m相同)

(1)如果n个元素构成了m-1个集合,那么第n+1个元素单独构成一个集合。

(2)如果n个元素已经构成了m个集合,将第n+1个元素插入到任意一个集合。方案数 m*S(n,m)

  1. bn独自占一个盒子;那么剩下的球只能放在r-1个盒子中,方案数为:f(n-1, r-1)
  1. bn与别的球共占一个盒子;那么可以事先将b1,b2,……bn-1这n-1个球放入r个盒子中,然后再将球bn可以放入其中一个盒子中,方案数为 :r*f(n-1,r)

对于不同的盒子:需要乘上盒子的阶乘!

#include<iostream>
using namespace std;//盒子与球(斯特林数)
typedef long long ll;
ll f(int n,int r){//f(n,r):表示n个球放入r个盒子的方案数if(r<=0||n<r) return 0;//不成立的情况if(n==r) return 1;//盒子与球数相等else return (f(n-1,r-1)+f(n-1,r)*r);//第n个球独占一个盒子+第n个球与别的球共占一个盒子
}
ll fac(int r){//r种不同的盒子if(r==1) return 1;else return r*fac(r-1);
}
int main()
{ll n,r;cin>>n>>r;cout<<f(n,r)*fac(r)<<endl;return 0;
}

青原樱(插空法)

题目描述

扶苏是一个非常喜欢边听古风鸽边写数学题的人,因此这道题其实是个五三原题。

扶苏希望重现青原上樱花盛开的景色,于是他准备了很多互不相同樱花树幼苗,准备种成一行

这一行中,一共有 n 个位置可以种下樱花,而扶苏准备了 m 支幼苗。由于樱花盛放时对左右空间需求非常大,所以樱花不能紧挨着种植,也就是任意两支幼苗之间必须至少存在一个不种花的空位置。

按照这种方式种花并不难,但是令扶苏感到好奇的是一共有多少合法的方案让他把这 m 支幼苗都种下去。一个方案是合法的当且仅当他满足上一段中叙述的要求。如果我们将花按照 1,2,3,…,m 编号,两种方案不同当且仅当被选择种花的位置不同从左向右数花的编号序列不同

为了避免输出过大,答案对一个参数 p 取模

输入格式

每个输入文件中有且仅有一组测试数据。

测试数据只有一行四个整数,依次代表 type, n, m, p,其中 type 是一个帮助你判断测试点类型的参数,会在数据范围中说明。

输出格式

输出一行一个整数,代表答案对 p 取模的结果。

输入 

1 3 2 19260718

输出 

2

说明/提示

样例输入输出 1 解释

一共有 2 个樱花幼苗, 3 个种花的位置,如果给幼苗编号为 1, 2,位置编号为 1, 2, 3,那么两种方案分别如下:

位置 1 2 3
方案 1 幼苗 1 幼苗 2
方案 2 幼苗 2 幼苗 1

数据规模与约定

本题采用多测试点捆绑测试,共有 6 个子任务

子任务编号 n ≤ m≤ type= 特殊性质 子任务分值
1 1 1 0 特殊性质 1 5
2 20 20 1 特殊性质 1 15
3 400 200 2 20
4 2000 2000 3 20
5 2000000 1000000 4 特殊性质 2 20
6 2000000 1000000 5 20

特殊性质 1:保证对应测试点的实际方案数(在取模前)不超过 10^6

特殊性质 2:保证 p 是一个质数。

对于 100% 的数据,保证:

  • 1≤n≤2×10^6。
  • 1≤m≤10^6。
  • 1≤p≤10^9。
  • 1≤m≤⌈2n​⌉。

提示

  • 请使用合适的数据类型来进行运算,避免溢出。
  • 参数 type 可以帮助你快速的判断子任务编号。

m个花盆,r朵花,可以插得位置:n−m+1个 C(n-m+1)(m);

又因m个花盆先后顺序没有要求。所以,还要乘上m!

ans = (n-m+1)! / (n-m+1-m)!, 约分后得 == 从(n-2m+2)乘到(n-m+1)【(n-2m+1)!被约去了】

又 (a*b) mod p == (a mod p *b mod p) mod p

分析到这里,type其实没什么用,输入之后就没有用了

#include<iostream>
using namespace std;//青原樱
long long type,n,m,p,ans=1;
int main()
{cin>>type>>n>>m>>p;for(int i=n-2*m+2;i<=n-m+1;i++){ans=((ans%p)*(i%p))%p;}cout<<ans<<endl;return 0;
}

博弈论+数学

取数游戏II(奇偶判断)

题目描述

有一个取数的游戏。初始时,给出一个环,环上的每条边上都有一个非负整数。这些整数中至少有一个0。然后,将一枚硬币放在环上的一个节点上。两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流取数,取数的规则如下:

(1)选择硬币左边或者右边的一条边,并且边上的数非0

(2)将这条边上的数减至任意一个非负整数(至少要有所减小);

(3)将硬币移至边的另一端。

如果轮到一个玩家走,这时硬币左右两边的边上的数值都是0,那么这个玩家就输了

如下图,描述的是Alice和Bob两人的对弈过程,其中黑色节点表示硬币所在节点。结果图(d)中,轮到Bob走时,硬币两边的边上都是0,所以Alcie获胜。

(a)Alice (b)Bob (c)Alice (d)Bob

现在,你的任务就是根据给出的环、边上的数值以及起点(硬币所在位置),判断先走方是否有必胜的策略

输入格式

第一行一个整数N(N≤20),表示环上的节点数。

第二行N个数,数值不超过30,依次表示N条边上的数值。硬币的起始位置在第一条边与最后一条边之间的节点上。

输出格式

仅一行。若存在必胜策略,则输出“YES”,否则输出“NO”。

输入 #1

4
2 5 3 0

输出 

YES

输入 #2

3
0 0 0

输出 

NO

首先,如果从起点(顺时针或逆时针)到第一个出现0的地方有偶数条边,那么先走的一定赢;

如果这有奇数个,那么先手第一步无论怎么取,都将自己置于一个必败状态。

#include<iostream>
using namespace std;//区数游戏(博弈论)
int n,a[21];
int main()
{cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++){//顺时针数if(a[i]==0){if(i%2==0){cout<<"YES";return 0;}else break;}}for(int i=n;i>0;i--){//逆时针数if(a[i]==0){if((n-i+1)%2==0){cout<<"YES";return 0;}else break;}}cout<<"NO"<<endl;return 0;
}

【模板】nim 游戏(异或和)

题目描述

甲,乙两个人玩 nim 取石子游戏。

nim 游戏的规则是这样的:地上有 n 堆石子(每堆石子数量小于 10^4),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取每次只能从一堆里取。最后没石子可取的人就输了。假如甲是先手,且告诉你这 n 堆石子的数量,他想知道是否存在先手必胜的策略。

输入格式

本题有多组测试数据。

第一行一个整数 T (T≤10),表示有 T 组数据

接下来每两行是一组数据,第一行一个整数 n,表示有 n 堆石子,n≤10^4。

第二行有 n 个数,表示每一堆石子的数量.

输出格式

共 T 行,每行表示如果对于这组数据存在先手必胜策略则输出 Yes,否则输出 No

输入 

2
2
1 1
2
1 0

输出 

No
Yes

乍一看好像跟上面一道题一样一样的,但是,仔细想,这个不存在“逼”的问题,后手可以选择任意一堆且可以不选完。所以跟上面不是一个思路!

思路:证明所有石子异或和为0则先手必输(妙啊~)

证明:(说明:2^=5:按(二进制)位异或运算)

  1. 反正最终情况就是每堆都为0,先手必输,所以我们考虑怎么把情况转换到这里。

  2. 如果异或和的最高位为i,则有一堆石子第i为为1(不然怎么会有i位)

  3. 设A1就为那堆石子,其他堆石子异或和设为x,总异或和设为k,则 A1 xor x=k,把A1变成A1 xor k,那么后手面对的则是(A1 xor k)xor x=0,

    举个例子:11001 异或 11100=101,则有(11001 异或 101)异或 11100=0

  4. 如果现在的异或和已经为0了(不为最终情况),那么怎么转换异或和都不能为0

  5. 我们根据 3. 4. 得出:如果先手异或和不为0,可以一步让后手的情况为异或和为0;如果先手异或和为0,那么后手异或和就不为0

  6. 终于开始进行游戏了,如果现在先手面对的情况异或和不为0,则一直让后手异或和为0,最后面对最终情况,后手输,则先手赢;如果先手面对的情况异或和为0,后手则赢

#include<iostream>
using namespace std;//nim游戏
int t,n;
int main(){cin>>t;while(t--){cin>>n;int ans=0;for(int i=1; i<=n; ++i){int x;cin>>x;ans^=x;//异或}if(!ans) cout<<"NO"<<endl;else cout<<"Yes"<<endl;}
}

基础数学问题3(洛谷)相关推荐

  1. 基础数学问题1(洛谷)

    进制转换(2~16任意相互转换) 题目描述 请你编一程序实现两种不同进制之间的数据转换. 输入格式 共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n&g ...

  2. 洛谷 深基 第4部分 基础数学与数论(19-21课)

    洛谷 深基 第4部分 基础数学与数论  第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...

  3. 【数学1】基础数学问题 - 题单 - 洛谷

    这里写目录标题 [[数学1]基础数学问题 - 题单 - 洛谷](https://www.luogu.com.cn/training/117) [P1143 进制转换](https://www.luog ...

  4. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  5. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  6. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  7. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  8. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

  9. 洛谷P1417 烹调方案

    洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...

最新文章

  1. 共面阻抗对高频PCB 设计中传输线阻抗控制的影响
  2. 【转】SAP技术趋势及建议
  3. Android 实用开源控件
  4. 【Siddhi】Siddhi的window操作
  5. oracle更新数据还原,oracle误drop/update操作后的数据恢复测试
  6. 统计学习方法读书笔记9-朴素贝叶斯习题
  7. Mat 创建图像的理解
  8. SVPWM算法原理及详解
  9. 深度学习——PReLU激活
  10. java矩阵连乘算法_矩阵连乘(java实现)
  11. word文件做一半未响应_WORD文件一编辑就未响应如何处理
  12. 《如何阅读一本书》读后
  13. 一支管理高效的技术团队是什么样子的?
  14. 解决阿里云ECS服务器下载 git 资源慢的问题
  15. 碱性溶液中HER动力学分析
  16. LinuxC语言简单实现图片加马赛克-标准IO实现
  17. 社保公积金异地转移(上海->宁波)持续更新中
  18. Kubernetes多节点二进制部署
  19. 速看!deep learning(rnn、cnn)调参的经验
  20. 都匀三中2021高考成绩查询,2017年黔南州高考各县市600分以上人数统计表,都匀市仅排第九。...

热门文章

  1. 【108】Multiavatar-多元文化头像随机生成器
  2. 冤案?假案?错案?检察院这么办案,真神奇!
  3. python图片转文字easyocr_Python 实现OCR文字识别 TensorFlow 版本
  4. OkHttp系列之入门篇
  5. cn域名保护隐私_爱名网正式开启CN域名隐私保护
  6. Jpcap JAVA捕捉并分析网络数据包
  7. 【正一专栏】榆林产妇和程序员苏享茂怎样你们都不该去死
  8. 易康(eCognition)
  9. “正道区块链,清风全国行”,脑海链提出知识经济产业区块链应用方案
  10. 海波龙(Hyperion)所有产品和技术文档下载地址..