This commit is contained in:
Zengtudor 2025-02-07 09:38:45 +08:00
parent 14931b0266
commit 3ee4ba75d5
5 changed files with 243 additions and 24 deletions

38
src/2/P1495.cpp Normal file
View File

@ -0,0 +1,38 @@
#include <cstdint>
#include <iostream>
#include <tuple>
#include <vector>
using ll = int64_t;
std::tuple<ll,ll,ll> exgcd(const ll &a,const ll &b){
if(b==0){
ll x=1,y=0;
return std::make_tuple(a,x,y);
}
auto[d,x,y] = exgcd(b, a%b);
const ll tmpy = y;
y=x-a/b*y;
x=tmpy;
return std::make_tuple(d,x,y);
}
ll inv(const ll &n,const ll &p){
auto[d,x,y]=exgcd(n, p);
x=(x%p+p)%p;
return x;
}
int main(){
ll N;
std::cin>>N;
std::vector<ll> p(N),n(N);
for(ll i{0};i<N;i++){
std::cin>>p[i]>>n[i];
}
ll prod{1};
for(ll pi:p){
prod=prod*pi;
}
}

View File

@ -1,11 +1,54 @@
#include <cstdint>
#include <cstdlib>
#include <iostream>
#include <ostream>
#include <string>
using ll = int64_t;
ll a,b;
ll exgcd(ll a,ll b,ll&x,ll&y){
if(b==0){
x=1,y=0;
return a;
}
ll d = exgcd(b,a%b,x,y);
ll tmpy = y;
y = x-a/b*y;
x=tmpy;
return d;
}
ll inv(ll a,ll p){
ll x,y;
if(exgcd(a,p,x,y)!=1){
std::cout<<"Angry!\n"<<std::endl;
exit(0);
}
while(x<0){
x=(x%p+p)%p;
}
return x%p;
}
ll str2num(const std::string &str,const ll &p){
ll num{};
for(const auto&s:str){
num=(num*10+(s-'0'))%p;
}
return num;
}
const ll p{19260817};
int main(){
std::cin>>a>>b;
std::string stra,strb;
std::cin>>stra>>strb;
a=str2num(stra, p),b=str2num(strb, p);
if(b==0){
std::cout<<"Angry!\n";
return 0;
}
std::cout<<(a*inv(b,p))%p<<'\n';
}

60
src/2/P5431.cpp Normal file
View File

@ -0,0 +1,60 @@
#include <cctype>
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <tuple>
using ll = int64_t;
std::tuple<ll,ll,ll> exgcd(ll a,ll b){
if(b==0){
ll x=1,y=0;
return std::make_tuple(a,x,y);
}
auto [d,x,y] = exgcd(b,a%b);
ll tmpy=y;
y=x-a/b*y;
x=tmpy;
return std::make_tuple(d,x,y);
}
ll inv(ll n,ll p){
auto[a,x,y] = exgcd(n, p);
x=(x%p+p)%p;
return x;
}
struct ReadNum{
char c;
ll w;
ReadNum&operator>>(ll&n){
c=n=0,w=1;
while(!isdigit(c)){
if(c=='-'){
w = -1;
}
c = getchar();
}
while(isdigit(c)){
n=n*10+(c-'0');
c=getchar();
}
n=n*w;
return *this;
}
}readint;
int main(){
ll n,p,k,ans{},ai,a{1};
readint>>n>>p>>k;
ll kp{1};
for(ll i{1};i<=n;i++){
kp=(kp*k)%p;
}
for(ll i{1};i<=n;i++){
readint>>ai;
a=(a*ai)%p;
}
ans=(kp*inv(a,p))%p;
std::cout<<ans<<'\n';
}

View File

@ -1,9 +1,6 @@
#include <cstdint>
#include <iostream>
#include <istream>
using ll = int64_t;
ll T;
ll exgcd(ll a,ll b,ll&x,ll&y){
@ -12,27 +9,12 @@ ll exgcd(ll a,ll b,ll&x,ll&y){
return a;
}
ll d = exgcd(b,a%b,x,y);
ll tmpy = y;
y = x-(a/b)*y;
x=tmpy;
ll tempy = y;
y=x-a/b*y;
x=tempy;
return d;
}
int main(){
// std::iostream::sync_with_stdio(false);
// std::cin.tie(nullptr),std::cout.tie(nullptr);
std::cin>>T;
while(T--){
ll a,b,c;
std::cin>>a>>b>>c;
ll x,y;
ll g{exgcd(a,b,x,y)};
if(c%g!=0){
std::cout<<-1<<'\n';
continue;
}
ll f = c/g;
}
}

96
src/2/day3.md Normal file
View File

@ -0,0 +1,96 @@
<think>
好的,我现在要帮用户讲解排列组合的问题。首先,得理解用户的需求是什么。
之前他问过数学题,所以可能对这方面有兴趣。现在他想深入了解排列和组合的区别以及应用。
我应该先解释什么是排列,包括定义、公式,并举一个具体的例子让用户更容易理解。接着是组合,同样要给出定义、公式和实例,
比较两者之间的区别,帮助用户记住它们的不同。
然后,可以扩展一些基本的排列组合问题类型,比如重复元素的问题或者分组分配问题,并用实际的例子说明如何解决这些问题。这
样可以让用户不仅了解基础概念,还能应用到实际中去。
最后,总结一下排列组合的应用场景,比如概率、统计和计算机科学中的排序算法,这些都能让用户明白学习这部分知识的重要性。
整体上,语言要尽量口语化,避免过于学术化的表达,让讲解更易于理解。同时,确保每个部分都有清晰的解释和例子,帮助用户一
步步掌握排列组合的知识。
</think>
好的!排列组合是数学中一个非常重要的领域,常用于解决计数问题。以下是一些基本概念和常见问题类型:
---
### **1. 排列Permutation**
**定义:**
排列是指从一组元素中按一定的顺序选取若干个元素进行排列的方式数。
- **公式:**
- 如果有 **n** 个不同的元素,从中选出 **k** 个元素的排列数为:
$$
P(n, k) = \frac{n!}{(n - k)!}
$$
- 其中,"!" 表示阶乘。
- **例子:**
- 比如从3个不同的书A、B、C中选出2本排列在书架上有多少种方法
- 排列数为 $ P(3, 2) = \frac{3!}{(3-2)!} = \frac{6}{1} = 6 $ 种。
- 具体的排列方式是AB、BA、AC、CA、BC、CB。
---
### **2. 组合Combination**
**定义:**
组合是指从一组元素中不考虑顺序地选取若干个元素的方式数。
- **公式:**
- 有 **n** 个不同的元素,从中选出 **k** 个元素的组合数为:
$$
C(n, k) = \frac{n!}{k!(n - k)!}
$$
- **例子:**
- 比如从4个不同的水果A、B、C、D中选出2个放在篮子里有多少种方法
- 组合数为 $ C(4, 2) = \frac{4!}{2!(4-2)!} = \frac{24}{2 \times 2} = 6 $ 种。
- 具体的组合方式是AB、AC、AD、BC、BD、CD。
---
### **3. 排列和组合的区别**
- **排列**:考虑顺序,$ P(n, k) $
- **组合**:不考虑顺序,$ C(n, k) $
例如:
- 从3个元素中选2个排列AB 和 BA 是不同的则排列数为6种。
- 从3个元素中选2个组合AB 和 BA 视为相同则组合数为1种。
---
### **4. 常见的排列组合问题类型**
#### (1) 不带重复元素的排列组合
- 直接使用上述公式即可解决。
#### (2) 带有重复元素的排列组合
- 如果允许元素被多次选择(即可以重复),则计算方式不同。
- **排列**$ P(n, k \text{ with repetition}) = n^k $
- **组合**:计算公式较为复杂,一般使用“星与条”方法或生成函数。
#### (3) 分组问题
- 将元素分成若干个组,每组有特定数量的元素。
- 例子将10本书分成3组每组分别有2本、3本和5本。
#### (4) 排列中的限制条件
- 某些元素必须出现在特定位置或不在某些位置。
- 例如:“某人必须坐在某个座位上” 或 “某两个人不能相邻”。
---
### **5. 应用场景**
排列组合广泛应用于概率论、统计学、计算机科学(如算法设计和排序问题)以及日常生活中的计数问题。
- **例子:**
- 赌球胜负预测如果有3场比赛每场有2种可能的结果胜或负总共有 $ 2^3 = 8 $ 种可能的组合。
- 遗传密码学DNA序列中的碱基排列方式可以用排列组合来计算。
---
希望这些内容能帮助你理解排列组合的基本概念和应用!如果有具体问题,可以随时问我哦! 😊