kuangbin专题 数论基础 part1?
线段树专题太难了,那我来做数学吧!
但数学太难了,我......(扯
这两天想了做了查了整理了几道数学。
除了一些进阶的知识,像莫比乌斯反演,杜教筛,min25学不会我跳了,一些基础的思维还是可以记录一下。
ex_gcd
POJ 1061 青蛙的约会
POJ 2115 C Looooops
SGU 106 The equation
三连击。
谈谈理解吧,原理我没懂 (扯
就是通过exgcd求出来的gcd(a,b)=d,而c%d!=0说明无解。
再将a,b,c分别除以公约数d。 a/=d,b/=d,c/=d;
exgcd出来x=1, x*=c就是一个特解。其中x的最小正解(这里包括0)是 (x%b+b)%b; 此时的y可以相应用 y=(c-a*x)/b 反过来求解得到。
同理 y的最小正解相应可得到,y*=c 再 (y%a+a)%a;
这里要特别注意尽量让a,b初始都是正的,而且特别注意要保证 ax+by=c这样的式子的形式,特别是c的位置,c负的没关系。
通解就可以通过特解加 任意个单位 ,比如 x=x0+b*k; y=y0-a*k;
什么什么解系?我线代忘啦(哭
然后SGU 106 注意如果每个参数负的,对应算出来的k区间要swap一下。因为你看那个负号在分母上呀。
还要用到ceil 和floor 。一直以来说精度误差,我都不想用这个函数,后来还是屈服了。
UVA 11752 The Super Powers
这题我思维呀,虽然我岔了。手玩一下,发现指数为合数就能成为答案。
然后我一开始想用优先队列!对素数的合数次幂加入答案。然后就没了,WA了好一阵子。
其实合数的合数次幂也存在答案啊,比如6^4,可以搞成6^(2*2 || 1*4) 并且这个是前面没出现的!所以啊 要处理所有的数的答案。用set维护,不能用优先队列了。
判溢出的细节
这我没想到啊,题目是ull,一直想根据负数或者数变小了来判,难搞的很。
还是看了题解才知道,用ull的上限,每次除这个数,预处理出每个数最多的指数的次幂,最多指数次幂都小于4(最小的合数)了,就break掉。
别头铁判溢出啊,反过来处理最多指数到几,这就很有灵性对吧。(我没有...
LightOJ 1370 Bi-shoe and Phi-shoe
POJ 2478 Farey Sequence
两个欧拉筛,我几个月的进步就是把我模板的筛从log升级到线性了红红火火恍恍惚惚。线性的还好理解,但min25和杜教目前必不可能懂555.
UVA 11426 GCD - Extreme (II)
这题好经典啊感觉。我只能想到预处理欧拉函数,对每个i 根号n的去找因数 那n^3/2就没了啊。
然后又发现了新大陆思维,对每个数去找因数,是不好找的一个过程,但你对每个因数去算他对别的数产生的贡献是很好搞的!
再有一个gcd的公式 我要对每个n找满足x与n 的gcd为i的个数,gcd(n,x)=i ,gcd(n/i,x/i)=1; 这不是phi[n/i]! 每个因数的贡献就转化为了 i*phi[n/i]
然后就有了对因数1,2,3,4,5...... 去加贡献 n+n/2+n/3+n/4+n/5+.....+1+....+0这个总复杂度咋算啊,md我居然不会,反正比上面的优秀多了
还有,既可以像我注释里一样,统计sum【i】,O(1)回答,这样预处理的复杂度就为上面那个式子;大概500ms;
还查到了别人对欧拉函数求了前缀和,然后直接对每个数O(n)统计,这个需要理解一下。只用200ms左右;
#include <bits/stdc++.h>
#define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int MOD=1e9+; const int MAXN=4e6+; bool notprime[MAXN];
//ll sum[MAXN];
//ll b[MAXN];
ll prime[MAXN/];
ll phi[MAXN];
int cnt; void getprime_phi()
{
cnt = ;
phi[] = ;
notprime[]=notprime[]=;
for(int i = ;i < MAXN;i++)
{
if(!notprime[i])
{
prime[cnt++] = i;
phi[i] = i-;
}
for(int j = ;j < cnt && i * prime[j] < MAXN;j++)
{
notprime[i*prime[j]] = ;
if(i%prime[j]==)
{
phi[i*prime[j]] = phi[i]*prime[j];
break;
}
phi[i*prime[j]] = phi[i]*(prime[j]-);
}
}
for(int i=;i<MAXN;++i) phi[i]+=phi[i-];
} int main()
{
getprime_phi();
/*for(int i=1;i<MAXN;++i)
{
for(int j=i*2;j<MAXN;j+=i)
{
b[j]+=1ll*phi[j/i]*i;
}
} for(int i=2;i<MAXN;++i)
sum[i]=sum[i-1]+b[i];*/
int n;
while(~scanf("%d",&n))
{
if(!n) break;
// printf("%lld\n",sum[n]);
ll ans=;
for(int i=;i<=n;++i) ans+=1ll*(phi[n/i]-)*i;
printf("%lld\n",ans);
}
return ;
}
POJ 2116 Death to Binary?
模拟题
将计算字符串的值 和 值转化字符串 封装成函数。
还是string好用,对未赋值的string,不能通过下标访问,但可以用+=,直接粘在后面,贼棒,我一开始用char 数组,好难搞的啊。
然后我这题没注意到输入可以为0,没测,然后出现了output limit exceed!活久见。然后发现自己原来的转化写假了,没特判0。就会输出贼多0,就没了,居然不是WA而是。
#include <string>
#include <iostream>
#include <algorithm>
#include <cstring> #define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
const int MAXN=;
const int INF=0x3f3f3f3f;
const int MOD=1e9+; ll f[];
void init()
{
f[]=;f[]=;
for(int i=;i<;++i) f[i]=f[i-]+f[i-];
} string s,t,ss,tt,goa; ll cal(string &str)
{
ll res=;
int len=str.size();
for(int i=;i<len;++i)
{
if(str[i]=='') res+=f[len-i-];
}
return res;
} void standard(string &tmp, ll val)
{
tmp="";
for(int i=;i>=;--i)
{
if(val>=f[i])
{
val-=f[i];
tmp+='';
}
else if(tmp!="")
{
tmp+='';
}
}
if(tmp=="") tmp="";
} int main()
{
init();
while(cin>>s>>t)
{
ll anss=cal(s);
standard(ss,anss); ll anst=cal(t);
standard(tt,anst); ll ans=anss+anst;
//debug(ans);
standard(goa,ans);
int len=goa.size();
int lens=ss.size();
int lent=tt.size(); for(int i=;i<len+-lens;++i) cout<<' ';
cout<<ss<<'\n';
cout<<"+ ";
for(int i=;i<len-lent;++i) cout<<' ';
cout<<tt<<'\n';
cout<<" ";
for(int i=;i<len;++i) cout<<'-';
cout<<'\n';
cout<<" "<<goa<<'\n'<<'\n';
}
return ;
} #include <string>
#include <iostream>
#include <algorithm>
#include <cstring> #define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
const int MAXN=;
const int INF=0x3f3f3f3f;
const int MOD=1e9+; ll f[];
void init()
{
f[]=;f[]=;
for(int i=;i<;++i) f[i]=f[i-]+f[i-];
} string s,t,ss,tt,goa; ll cal(string &str)
{
ll res=;
int len=str.size();
for(int i=;i<len;++i)
{
if(str[i]=='') res+=f[len-i-];
}
return res;
} void standard(string &tmp, ll val)
{
tmp="";
for(int i=;i>=;--i)
{
if(val>=f[i])
{
val-=f[i];
tmp+='';
}
else if(tmp!="")
{
tmp+='';
}
}
if(tmp=="") tmp="";
} int main()
{
init();
while(cin>>s>>t)
{
ll anss=cal(s);
standard(ss,anss); ll anst=cal(t);
standard(tt,anst); ll ans=anss+anst;
//debug(ans);
standard(goa,ans);
int len=goa.size();
int lens=ss.size();
int lent=tt.size(); for(int i=;i<len+-lens;++i) cout<<' ';
cout<<ss<<'\n';
cout<<"+ ";
for(int i=;i<len-lent;++i) cout<<' ';
cout<<tt<<'\n';
cout<<" ";
for(int i=;i<len;++i) cout<<'-';
cout<<'\n';
cout<<" "<<goa<<'\n'<<'\n';
}
return ;
}
UVA 10200 Prime Time
这都WA我,根号n试除法判素数即可,查了居然WA在精度,不知道啥道理。
记住,当不得不使用除法,浮点数需要保留几位小数四舍五入be rounded to,且你WA了,可以加个小的eps???
总结:
然后除了欧拉筛的模板题,其他好像都或多或少查了题解。
不过还是坚持想了,自己实现了,WA了T了才去查的。
只是感叹自己还是TCL,还要加油啊。算法竞赛本来就是需要经验积累的嘛!
kuangbin专题 数论基础 part1?的更多相关文章
- kuangbin专题十三-基础计算几何
链接:https://cn.vjudge.net/contest/68968 POJ 2318 TOYS 题意:m个玩具落在n+1个区间,给你玩具的坐标,问每个区间有多少玩具. 思路:叉积的简单应用, ...
- 「kuangbin带你飞」专题十四 数论基础
layout: post title: 「kuangbin带你飞」专题十四 数论基础 author: "luowentaoaa" catalog: true tags: mathj ...
- [kuangbin]专题六 最小生成树 题解+总结
kuangbin专题链接:https://vjudge.net/article/752 kuangbin专题十二 基础DP1 题解+总结:https://www.cnblogs.com/RioTian ...
- 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)
摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是 Hash 算法,RS ...
- [kuangbin带你飞]专题十四 数论基础
ID Origin Title 111 / 423 Problem A LightOJ 1370 Bi-shoe and Phi-shoe 21 / 74 Problem B ...
- aria2 源码解析专题—— (一)基础架构
此文章是这个专题的开篇,由于初入 C++ 的大门,所以想着拿个项目来看看,凑巧有点基础,又想学习一下在unix上的编程,所以就找了 aria2 这个库来看看源码,希望能学到一些东西. 言归正传,今天把 ...
- 【概念笔记】JAVA基础 - part1
IT`huhui前言录 这是自己对JAVA基础的一个小总结,会不断完善.因为时间仓促的原因. 每学习一段时间,停下来,静心总结一下,甚好.停停走,走走停,一往无前,不摔倒. 一些链接里面是我看到一些人 ...
- [原]最短路专题【基础篇】(updating...)
hud1548 a strange lift 最短路/bfs 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 题意:一个奇怪的电梯,每层楼的 ...
- lightoj1336数论基础
#include<iostream> #include<cstdio> #include<cmath> #define ll long long using nam ...
随机推荐
- Spring Boot (一) 校验表单重复提交
一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...
- SSH 免密登录服务器
本文详解如何以多种方法实现ssh免密码登陆远程服务器 阅读须知: 1.以下方法操作时请不要随意切换目录. 2.xxx为私钥,xxx.pub是公钥(默认一般文件名为id_rsa和id_rsa.pub,可 ...
- [CSS七分钟系列]都1902年了,还不知道用margin:auto给flex容器内元素分组?
最近看到几篇博文讲解margin:auto在flex容器中的使用,可惜的是大多讲解都浮于页面表现,没深究其中的作用机理,本文在此浅薄对其表现机理做简单探讨. 引子 日常业务迭代过程中,flex已经是前 ...
- windows安装Pytorch报错:from torch._C import * ImportError: DLL load failed: 找不到指定的模块”解决方案
问题描述 python环境下安装cpu版本pytorch,安装成功,但是导入出错. 报错如下 解决方法 参考博客,大家解决方法大概有:升级numpy.添加.dll文件到环境变量,均没有成功.本地pyt ...
- 2sql
------------------------------------ 高级查询-- as 起别名select name as 名字 from studnets;-- 消除重复的行 -- 查看有哪几 ...
- Fragment源码分析
转载请标明出处:http://blog.csdn.net/shensky711/article/details/53171248 本文出自: [HansChen的博客] 概述 Fragment表示 A ...
- solr 的安装和配置
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Http Get操 ...
- python中random的基本用法
那么怎么使 a 随机生成一个数值呢,来研究一下random的部分程序:python中random模块的几个函数可以随机生成数值,下面咱们看一下random的几个函数的使用方法. random()是不能 ...
- php 7.4 的 Unpacking inside arrays (...)
总的说明 php 7.4 增加了一个很有意思的功能 这是官方说明: Unpacking inside arrays <?php$parts = ['apple', 'pear'];$fruits ...
- 学习WebFlux时常见的问题
前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾一下上篇我对WebFlux的入门,如果没读过 ...