• 4.4上午:数学基础

(qwq整成word和cpp了,它居然不能直接把文档附上来)

  • part 1:高精度运算

高精加和高精减就不说了,之前写过博客了qwq,讲一讲高精乘和高精除吧。

1.高精度乘法(不知道为甚么害怕自己忘了老想再写一遍):

题干(就很简单惹):给定两个数a,b,求他们的乘积(a和b都很大);

显然如果直接乘,用一个数组存的话,可能会爆掉,(_int128也会爆的qwq),这时或许可以考虑将每一位分开存,然后就引入了神奇的高精度:

先读入两个数:这里用的是字符串char读入然后把每一位数字存到数组中:

for(int i = lena-;i >= ;i--)a[lena-i] = a1[i]-;//把字符串存进数组中
for(int i = lenb-;i >= ;i--)b[lenb-i] = b1[i]-;
/*刚刚搞了个大乌龙qwq(直接 a[lena-i] = a1[lena]-48;b[lenb-i] = b1[lenb]-48;*/
/*插入的主要代码qwq,lena,lenb分别为字符串a1,b1的长度。这里从1~len分别存从个位到x位的数字*/

首先有一个必须要解决的问题:乘出来的数应该存到哪一位??不妨模拟一下乘法计算:

由此可以看出,第一个数的第i项*第二个数的第j项应该放在i+j-1的位置。

搞定了前面,就可以进行乘法运算惹.,真的吹爆lh的算法:lh是先乘起来再处理,赶脚这样更好想也更好些一点;而且lh也没有用什么特判if之类的,让我这个蒟阵非常清楚自己在干什么qwq,比某ybt好多惹。

代码惹:

for(int i = ;i <= lena;i++)
for(int j = ;j <= lenb;j++)
c[i+j-] = c[i+j-]+a[i]*b[j]; //进行乘法运算
int len=lena+lenb-;//暂时定义最后答案的长度为lena+lenb-1(或许会更长,一会再处理)
for(int i=;i<=len;i++){
c[i+]+=c[i]/;//又搞了个乌龙导致答案算错惹,这些大概都是我的弱点吧(写一遍错一遍qwq
c[i]%=;
}

进行收尾的数据处理:

显然乘法计算时可能会有超出lena+lenb-1的情况,所以我们或许大概(啊呸)(那得麻溜的处理啊)需要处理一下:

这里有一个小细节,处理前方非零数位时,要用while而不是if,因为前面的数可能有若干个(突然想不没明白了qwq)

好惹,上代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
char a1[],b1[];
int a[],b[],c[],lena,lenb,lenc;
int main()
{
scanf("%s",a1);
lena = strlen(a1);
scanf("%s",b1);
lenb = strlen(b1);
for(int i = lena-;i >= ;i--)a[lena-i] = a1[i]-;//把字符串存进数组中
for(int i = lenb-;i >= ;i--)b[lenb-i] = b1[i]-;
//刚刚搞了个大乌龙qwq(直接 a[lena-i] = a1[lena]-48;b[lenb-i] = b1[lenb]-48;
for(int i = ;i <= lena;i++)
for(int j = ;j <= lenb;j++){
c[i+j-] += a[i]*b[j];
} //进行乘法运算
int len=lena+lenb-;//暂时定义最后答案的长度为lena+lenb-1(或许会更长,一会再处理)
for(int i=;i<=len;i++){
c[i+]+=c[i]/;
c[i]%=;
}
while(c[len+]!=)len++;
for(int i=len;i>=;i--)
printf("%d",c[i]);
}//亲测15*3是对的qwq

2.高精度除法(这里只讲了高精/低精):

其实高精除在乘法的基础上改一下核心语句就好惹,这里不细讲惹,我gun去写代码了,希望我核心的语句没有忘(写崩了写崩了!!!还是记不住qwq):

找到了错误,感觉自己还是在小细节上不够仔细(buxianggenvsheng),像什么scanf没有加引执符,%d搞成%s(这个是输入字符数组b的时候忘记改过来了qwq)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; char a1[];
int a[],b,c[],lena;
int main()
{
scanf("%s",a1);
lena = strlen(a1);
scanf("%d",&b);
for(int i = lena-;i >= ;i--)a[lena-i] = a1[i]-;//把字符串存进数组中
for(int i = lena;i >=;i--){//除法是唯一一个从高位开始算的
c[i]=a[i]/b;
a[i-1]+=(a[i]%b)*10;//意思是把这一位/b余下的余数加到下一位(比这一位低一位的)去(加到下一位就*10了呀)
}
while(c[lena]==)lena--;
for(int i=lena;i>=;i--)
printf("%d",c[i]);
}//亲测200/5有效

负数肿么办???

加法:一个数是负数:变为减法      两个数是负数:全部变为正数算加法,最后取负

减法:被减数是负数:全部变为正数算加法,最后取负    减数是负数:减数取负,变为加法    都是负数:都取负,变为减法,即(-减数)-(-被减数)

乘法:统计负数个数s 都变为非负数计算,若s为奇数,最后取负

  • part2:模意义下的运算:

1.性质:

无除法运算,满足基本的交换律、分配率、结合律 对中间结果取模不影响最终答案

eg:快速幂

计算a^b % p = ?

法一:分治思想:

这个题洛谷有板子(不过编译失败是个什么鬼??)(交了个板子题结果我炸了???):

行吧经过我无数次(5次欸qwq)的没过板子emm我终于搞了个a了的代码:

分治的思想就是一分为二嘛,求a^b%p,可以先求a^(b/2)%p再相乘,然后再%p,要注意的是b不整除2的时候最后还要乘一个a,然后存答案的话要用long long,要不然会爆的(我就爆了***)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a,b,p;
int fz(int a,int b,int p){
long long ans=;
if(b==)return ;//当b=0时,a^0=1;
ans=fz(a,b/,p);//搞分治,b每次/2
ans=ans*ans%p;
if(b%==)
ans=ans*a%p;//乘回来b为奇数的那个a
return ans;
}
int main(){
scanf("%d%d%d",&a,&b,&p);
cout<<a<<"^"<<b<<" mod "<<p<<"=";//这个是洛谷板子题的要求qwq
cout<<fz(a,b,p)%p<<endl;//一定要模p啊qwq
}

法二:快速幂(板子又没过emm难到我数据又爆了??好像还真是qwq ):

行惹过了。突然想小反思一下:

感觉自己学信息奥赛这么久了,总是犯一些细节性的东西,基础还是不扎实,还需要努力盘一盘基础qwq

快速幂思想算是比较难理解代码的思想了,其实数学思想还好,比较好理解,就怕代码qwq

下面是某只zay的lh的解释??

a^7 = a^1 * a^2 * a^4   2进制:111

a^11 = a^1 * a^2 * a^8  2进制:1011

a^25 = a^1 * a^8 * a^16  2进制:11001

所以首先计算出 a^1、 a^2、 a^4、 a^8 …,利用2进制表示出a,若第x位上为1,则乘a的x次方,若为0,则不乘。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long a,b,p;
int kuaisumi(long long a,long long b,long long p){//钟大佬kuaisumi(拼音)的操作天下无敌了
long long ans=;
while(b>){
if(b&)ans=ans*a%p;//满足第x位上是1,ans乘上a^(2^(x-1));
a=a*a%p;//这里一直计算着a^2k次方2k=2^(x-1);
b/=;
}
return ans;
}
int main(){
scanf("%d%d%d",&a,&b,&p);
cout<<a<<"^"<<b<<" mod "<<p<<"=";
cout<<kuaisumi(a,b,p)%p<<endl;
}

费马小定理:

对于素数p和任意正整数a(0 ~ p-1),有a^(p-1) ≡ 1(mod p)

b * a = t

t * a^(p-2) = b t/a=b

//在模p意义下除以一个数等于乘这个数的p-2次方

应用:计算C(n,m) % (10^9+7)  10^9+7是质数  n ,m<=10,0000   Query 10,0000

思路:C(n, m) = n! / ( (n-m)! * m! )

= n! * ( (n-m)! * m! )^(p-2)

= n! * ( (n-m)! )^(p-2) * (m! )^(p-2) 预处理任意n!、(n! )^(p-2)

这个预处理怕不是要炸掉???(顺便吐槽下lh的代码质量qwq真的是金牌吗??

日常写标程写炸qwq

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
long long n,m;
long long b[],d[];
long long p=1e9+;
long long pow(long long a,long long b,long long p){//快速幂求阶乘的p-2次方
long long ans=;
while(b>){
if(b&)ans=ans*a%p;
a=a*a%p;
b/=;
}
return ans;
}
long long C(long long x,long long y){//求组合数的函数(思路见上
if(m>n)return -;
if(m==n||m==)return ;
else return b[x]*d[x-y]%p*d[y]%p;
}
int main(){
scanf("%lld%lld",&n,&m);
b[]=;
for(int i=;i<=;i++)b[i]=b[i-]*i%p;//预处理1~100000的阶乘
for(int i=;i<=;i++)d[i]=pow(b[i],p-,p)%p;//预处理1~100000阶乘的p-2次方
cout<<C(n,m)<<endl; }

拓展:给定n,m,p求Cnm%p的值:

只需要改一下输入就可以了,变为输入三个数,p不再定义为1e9+7;

  • part3:

1.最大公约数:

这里用到了辗转相除(mo)法:请自行百度:

代码qwq:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a,b,x,y;
int gcd(int a,int b){
if(b==)return a;
else return gcd(b,a%b);
}
int main(){
cin>>a>>b;
cout<<gcd(a,b);
}

最小公倍数:

这里有个小知识qwq:

lcm(a,b)*gcd(a,b)=a*b;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a,b,x,y;
int gcd(int a,int b){
if(b==)return a;
else return gcd(b,a%b);
}
int main(){
cin>>a>>b;
cout<<a/gcd(a,b)*b;
}

end-

2019清明期间qbxt培训qwq的更多相关文章

  1. 2019清明期间qbxt培训qaq

    4.4下午:矩阵qwq part1矩阵乘法: 概念: 一个m×p的矩阵A 乘 一个p×n的矩阵B 得到一个矩阵一个m×n的矩阵AB 其中: 矩阵乘法满足结合律.分配率,不满足交换律 矩阵乘法—solu ...

  2. 2019.10.1 qbxt模拟题

    第一题 考虑树上\(DP\),f[i][j][0/1]表示以\(i\)为根的子树,入读为零点的个数为\(j\),点\(i\)的入度为\(0\)/不为\(0\)时的方案数 转移的时候考虑\(u\)的一个 ...

  3. 邀您共赴数据库学术顶会ICDE 2019——阿里云专场 零距离接触达摩院数据库“最强大脑”

    摘要: 当学术大家遇到技术大拿,会碰撞出怎样的火花?为进一步加深产学研学术交流,阿里云将于ICDE 2019大会期间(4月9日)举办以“云时代的数据库”为主题的技术专场(Workshop) 作为全球数 ...

  4. Luogu

    dalao们的博客a http://hzwer.com   //Orz  %%% https://oi-wiki.org  //Orz https://www.cnblogs.com/-guz/p/9 ...

  5. 【洛谷p2312】解方程

    (清明培训qwq,明天就要回学校了qwq拒绝) 行吧我洛谷都四天没碰了 解方程[传送门] 算法标签: (作为一个提高+省选-的题) 丁大佬真的很有幽默感emmm: #include <cstdi ...

  6. 【洛谷p2822】组合数问题

    (突然想          ??忘掉了wdt) (行吧那就%%%hmr) 组合数问题[传送门] (因为清明要出去培训数学知识所以一直在做数论) 组合数<=>杨辉三角形(从wz那拐来的技能 ...

  7. 20165210 Java第六周学习总结

    20165210 Java第六周学习总结 教材学习内容 第八章学习总结 String类: 构造String对象: 1. 常量对象 2. String对象 3. 引用String常量 字符串的并置: S ...

  8. 基于Maven + SSM (Spring、SpringMVC、Mybatis)构建一个简单的测试项目

    最近在公司实习期间的培训交流中有机会接触到SSM,然后自己花费1周的时间投入学习.谈不上深刻理解其中原理,所以没有涉及理论知识,只是浅层次的学习如何使用,在此将学习过程记录整理出来,一方面自己备用:另 ...

  9. [Alpha]Scrum Meeting#4

    github 本次会议项目由PM召开,时间为4月5日晚上10点30分 时长20分钟 任务表格 人员 昨日工作 下一步工作 木鬼 调整&分配工作 撰写博客目录 SiMrua 手工建立再训练数据( ...

随机推荐

  1. xss脚本绕过限制的方法

    第一关:第一关比较简单,直接写入标签就可以,这里不多说了,payload如下: http://sqler.win/xss/level1.php?name=test%3Csvg/onload=alert ...

  2. ng2-tree

    [转]https://github.com/valor-software/ng2-tree#eyes-demo  demo:http://valor-software.com/ng2-tree/

  3. 【Python全栈】HTML <!--...--> 注释 、CSS/JS //注释 和 /*.....*/ 注释

    HTML <!--...--> 注释 .CSS/JS //注释 和 /*.....*/ 注释 <!-- -->是HTML的注释标签,使用 < 和 > 是符合HTML ...

  4. ECMAScript6 入门教程 初学记录let命令 块级作用域

    一.基本语法-let命令 (1)ES6新增了let命令,用来声明变量.所声明的变量,只在let命令所在的代码块内有效. 循环的计数器,就很合适使用let命令.计数器i只在for循环体内有效,在循环体外 ...

  5. Access restriction: The type 'Unsafe' is not API

    错误:Access restriction: The type 'Unsafe' is not API Eclipse中有一种叫做存取限制的机制,来防止你错误使用那些非共享的API.通常来说,Ecli ...

  6. 使用mybatis-generator插件自动生成代码的步骤

    注意:首先你这个项目一定要是个maven项目 1.首先你需要在pom文件中导入相关的依赖,如下代码 <plugin> <groupId>org.mybatis.generato ...

  7. MySQL条件检索_WHERE

    MySQL使用WHERE命令来限定数据查询条件. 语法:SELECT 属性1,属性2 FROM 表名 WHERE 条件1 OR 条件2 AND 条件3 说明:WHERE同样适用于UPDATE.DELE ...

  8. Linux 查看磁盘使用情况

    Linux 查看磁盘使用情况 df 查看当前挂载空间使用情况 语法: df [选项]... [FILE]... 文件-a, --all 包含所有的具有 0 Blocks 的文件系统 文件--block ...

  9. expect拷贝文件例子

    ----安装expectcd /tmp wget http://core.tcl.tk/tcl/zip/release/tcl.zipwget https://jaist.dl.sourceforge ...

  10. 剑指offer(1)二维数组的查找

    限制今天起开始也刷剑指offer啦,一步一步来. 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数, ...