数论
HT008_123
家人们点点关注叭
展开
-
[ACM刷题] DP数论专题
A:求B对P的逆元就好了www#include <iostream>#include <cstdio>#define int long longconst int mod=9973;int inv,p,s;int exgcd(int a,int b,int &x,int &y){ if(!b) { x=1;...原创 2019-07-23 10:36:12 · 278 阅读 · 0 评论 -
10-29测试(QB DAY1)
立方数(cubic) Time Limit:1000ms Memory Limit:128MB题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8,27就是最小的3个立方数。 现在给定一个数P,LYK想要知道这个数是不是立方数。 当然你有可能随机输出一些莫名其妙的东西来骗分,因此LYK有T次询问~输入格式(cubic.in)原创 2017-10-29 11:41:08 · 414 阅读 · 0 评论 -
Hao
【问题描述】 从中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数最大可能是多少。 【输入格式】 第一行一个数字。 【输出格式】 一行一个整数代表答案对取模之后的答案。 【样例输入】 7 【样例输出】 144 【样例解释】 但是塔外面有东西。 0=< N< =5*1E6思路:想让一个数为完全平方数,那么这个数分解质因数后每个质因数的次数一定是偶数次个。 反其道而行之原创 2017-10-06 16:07:45 · 289 阅读 · 0 评论 -
hahaha
小Q对计算几何有着浓厚的兴趣。他经常对着平面直角坐标系发呆,思考一些有趣的问题。今天,他想到了一个十分有意思的题目:首先,小Q会在轴正半轴和轴正半轴分别挑选个点。随后,他将轴的点与轴的点一一连接,形成条线段,并保证任意两条线段不相交。小Q确定这种连接方式有且仅有一种。最后,小Q会给出个询问。对于每个询问,将会给定一个点,请回答线段OP与条线段会产生多少个交点?小Q找到了正在钻研数据结构的你,希望原创 2017-10-06 11:42:01 · 185 阅读 · 0 评论 -
NP(分块打表)
对于前80%的数据,若n>=p,ans=0 若n#include <cstdio>#include <iostream>#define ll long longusing namespace std;long long n=1,mod=1e9+7;long long ans=1;void ts(int x){ for(long long i=1;i<=mod;i++)原创 2017-10-07 09:21:16 · 570 阅读 · 0 评论 -
欧拉函数求和
没错,傻X博主只是吸引你点进来的,我TM不会正解,60暴力送上#include <cstdio>#include <iostream>using namespace std;const int N=99999999;int phi[N+10],prime[N+10];int tot;bool mark[N+10];long long getphi(int n){ phi[1]原创 2017-10-08 10:09:40 · 1651 阅读 · 0 评论 -
逆欧拉函数
因为 于是逆推,x=φ(x)*(p1/(p1-1))…(pn/(pn-1)) 搞出10^7以内的质数值,根据上面的式子不断的递归,直到φ(x)==1就找到了相应的x了。 但是测试数据和STD不太对,因为STD当φ(N)==1,不会筛2,,其实是可以晒的。 只要把返回写到后面去就行了。#include <cstdio>#include <iostream>#include <cstdl原创 2017-10-08 09:02:50 · 617 阅读 · 0 评论 -
求一个很大的数的欧拉函数
本来挺简单的,可是n太大了,用欧拉线性筛都不行啊!这可咋办呢? P为N的质因数 Phi(N)=N*(1-(1-1/p1)) * (1-(1-1/p2))… * (1-(1-1/pn)). 然后呢?这么大的数让我分解个毛线! 分解大的数需要用Pollard-rho整数分解 实现方法:生成两个整数a和b,计算p=gcd(a-b,n),直到p不为1或者a,b出现循环为止,若p=n,则p为质数,否原创 2017-10-07 21:12:41 · 4017 阅读 · 2 评论 -
巧克力
题目描述 LYK找到了一根巧克力棒,但是这根巧克力棒太长了,LYK无法一口吞进去。 具体地,这根巧克力棒长为n,它想将这根巧克力棒折成n段长为1的巧克力棒,然后慢慢享用。 它打算每次将一根长为k的巧克力棒折成两段长为a和b的巧克力棒,此时若a=b,则LYK觉得它完成了一件非常困难的事,并会得到1点成就感。 LYK想知道一根长度为n的巧克力棒能使它得到最多几点成就感。输入格式(chocolat原创 2017-10-07 14:39:59 · 303 阅读 · 0 评论 -
10-30上午测试(DAY 2 R1)
T1 暴力70 正解DP+贪心(QAQ) 本来写对了,理解错题意了。 DP[i][j]表示跳了i个楼,目前在j楼的最小花费。 首先我们的DP是从1->n的。 那么我们会想顺序会不会产生影响。 显然是会的 比如 1高度3 2为1 3为3 顺序跳显然不如1->3->2优。 所以先把楼按照高度升序或者降序排列。显然dp[0][i]=c[i] 转移dp[i][j]可以从1->(j-1)原创 2017-10-30 16:17:19 · 352 阅读 · 0 评论 -
入阵曲+将军令
QAQ 性质,如果一个 a1%k==a2%k,那么这两个数的和就是k的倍数 预处理矩阵和,然后枚举2个行,1个列 转换成上面的问题#include <cstdio>#include <iostream>#include <cstring>#define ll long longusing namespace std;ll map[500][500],s[500][500];ll cn原创 2017-11-07 20:51:30 · 372 阅读 · 0 评论 -
《瞿葩的数字游戏》T3-三角圣地
题目描述:雾题目分析:观察发现越大的数排在中间位置对答案越有利,所以就可以贪心了 1 3 4 2 那么第一个位置1对答案贡献1次 第二个位置3对答案贡献3次 第三个位置4对答案贡献3次 第四个位置2对答案贡献1次不难发现这个贡献次数为杨辉三角(就是组合数) 我们可以O(n^2)求出组合数对10007的取模 ans=∑ni=1C(n,i)∗ians=∑i=1nC(n,...原创 2018-03-29 09:04:04 · 183 阅读 · 0 评论 -
[模板] 卢卡斯定理
题目描述:求Cmn+m% pCn+mm% p保证p为质数题目分析:卢卡斯定理 Cmn% p=Cm%pn%p∗Cm/pn/p%pCnm% p=Cn%pm%p∗Cn/pm/p%p题目链接:Luogu 3807Ac 代码:// luogu-judger-enable-o2#include <cstdio>#include <iostre...原创 2018-03-29 09:00:13 · 162 阅读 · 0 评论 -
[SDOI2008] 仪仗队
题目描述:雾.题目分析:我们可以将图沿对角线切成两个直角三角形 观察可以发现,从第三行开始,第i行中当前直角三角形范围内能观察到的点数等于(i-1)的欧拉函数值题目链接:Luogu 2158Ac 代码:#include <iostream>#include <cstdio>#include <algorithm>...原创 2018-03-27 21:41:50 · 143 阅读 · 0 评论 -
[CF 947 A] Primal Sport
题目描述:雾。题目分析:设 f[n] 为 n的 最大因子 那么x2-f[x2]+1<=x1<=x2题目链接:CF 947 AAc 代码:#include <cstdio>#include <iostream>int f[110000];int main(){ int n; scanf("%d...原创 2018-04-02 08:38:33 · 213 阅读 · 0 评论 -
Endless
性质: 偶数位上必须为0,统计奇数位上的方案 做法: 先把N转化成K进制表示。 如果最高位为偶数位,那么奇数为可以任选0-k 答案即为klen/2k^{len/2} 如果为奇数位,不能超过最大数,向后走计算,直到变为情况1#include <cstdio>#include <iostream>#define ll long longusing namespace std;ll b原创 2017-11-04 21:19:40 · 192 阅读 · 0 评论 -
立方体+仓库
立方体 cube.in/.out/.cpp 【问题描述】 在 n 维空间中,一个单位立方体由 2^n 个点组成。 他们的坐标形如 (x 1 ,x 2 ,…,x n ),x i ∈ {0,1}。 定义 n 维空间中两点的距离为其曼哈顿距离,点 p (p 1 ,p 2 ,…,p n ) 与点 q (q 1 ,q 2 ,…,q n ) 的距离为 ∑ n i=1 |p i − q i |。原创 2017-11-03 10:54:59 · 368 阅读 · 0 评论 -
10-24机房测试
出现的问题: T1我贪错心了。。。。。。 T2是从1-k任何一个房间走都可以走到1,k+1-n任何一个走不能走到1. 我理解反了,理解成了存在性问题,写出来的爆暴力样例都过不了。。。 T3人家巨人只能往前跳,我认为可以往后跳。于是我认为这题太麻烦了,做个屁啊。 然后今天就GG了 很绝望啊。T1 小G搭积木题目描述 小 G 喜欢搭积木。小 G 一共有 n 块积木,并且积木只能竖着一块一块原创 2017-10-25 10:44:49 · 250 阅读 · 0 评论 -
洛谷10月月赛R1·浴谷八连测R1·提高组 T1
思路很简单,先对k分解质因数,存入一个数组中去。 然后对于n的阶乘分解那个数组的质因数,除数量,取最小值! 刚开始忘特判tot==0,ans开的不够大!#include <cstdio>#include <iostream>#define ll long longusing namespace std;const int maxm=1e7;ll prime[maxm],cnt;b原创 2017-10-15 08:31:28 · 494 阅读 · 0 评论 -
她
前30暴力枚举,特判无解情况。 再20 L==R,变为解同余方程#include <cstdio>#include <iostream>#define LL long longusing namespace std;long long x,y;long long gcd(long long a,long long b){ if(!b) return a; return原创 2017-10-06 21:52:11 · 338 阅读 · 0 评论 -
拓展欧几里得算法
因为博主是个sb,所以下文内容有可能不对,推荐大家去看这篇博文,对不起了 欧几里德算法部分我们好像只能用来求解最大公约数,但是扩展欧几里德算法就不同了,我们既可以求出最大公约数,还可以顺带求解出使得: a*x + b*y = gcd 的通解 x 和 y 扩展欧几里德定律: 对于不完全为0的非负整数a,b,gcd(a, b)表示a, b的最大公约数,必定存在整数对x,y,满足a*x+b*y==原创 2017-05-19 16:43:10 · 322 阅读 · 0 评论 -
站军姿
相离和内含的好搞。 主要是有重合的(扇形-三角)#include <cstdio>#include <iostream>#include <cmath>using namespace std;double pi=acos(-1);int main(){ int t; scanf("%d",&t); for(int i=1;i<=t;i++) {原创 2017-09-17 18:02:32 · 312 阅读 · 0 评论 -
超级质数
QAQ 一个数是超级质数是要把这个数/10分解判断,那么反过来,我们直接从素数的基础上造超级质数,但是我们造出来的并不一定是素数,所以要有个素数判断,使用最简单的sqrt(n)判断#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>using namespace原创 2017-08-09 15:46:37 · 967 阅读 · 0 评论 -
阶乘
QAQ 因为要非零的最后一位,所以在乘的过程中将值中的0搞掉 需要注意的是太大的时候要取模100000#include <iostream> #include <queue> #include <string.h> #include <cstdio>#include <cstring>using namespace std;int cf(int x){ while(x%原创 2017-06-09 16:44:38 · 302 阅读 · 0 评论 -
计算系数
QAQ 可以发现,x^n*y^m项的系数一定有一个因数a^n*b^m,所以可以提取出来。 剩下的就是(x+y)^k 的x^n*y^m项的系数了 也就是C(k,n)。 我们可以用杨辉三角的递推来求C(k,n) 而这个a^n*b^m破东西可以用快速幂来求是吧!!!#include <cstdio>#include <iostream>using namespace std;const i原创 2017-06-06 10:01:28 · 651 阅读 · 0 评论 -
算
其实就是个等比数列求和,只是除不满足同余的性质,需要求一下逆元 a/bmodp,在这个题中,b与p是互质的,可以用费马小定理去求逆元 a/bmodp=a*b^p-2%p 这样就可以取模了 用上这个求和公式的方法大约的时间复杂度为O(n*logm),比暴力强多了 当然还需要注意一下,当公比是1时,要特判一下,因为分母不能为0#include <cstdio>#include <iostre原创 2017-05-17 15:35:38 · 409 阅读 · 0 评论 -
青蛙的约会
QAQ 蛤蛤蛤 这道题要求我们求得两只青蛙相遇时最少的天数 根据描述有 (x+m*t)-(y+n*t)=p*L (t是跳的次数,p是a,b的圈数差) 展开转化有 (n-m)*t+L*p=y-x; 令a=n-m,b=L,c=y-x 有 a*t+b*p=c 令 g=gcd(a,b),若上面方程有解,则a*t/g,b*p/g, c/g都为整数 方程两边都乘(c/g) 得到 a*t0*(原创 2017-05-21 08:24:59 · 358 阅读 · 0 评论 -
欧拉线性筛
对于线性筛素数的增添,可以同时求出每个数的欧拉函数 首先需要三个性质 证明链接(转) 性质一:若p为质数,phi[p]=p-1(显然) 性质二:若 i mod p=0(p为质数),那么有phi[i*p]=p*phi[i] 性质三:若 i mod p≠0,那么phi[i*p]=phi[i]*(p-1)#include <cstdio>#include <iostream>using na原创 2017-05-27 11:23:37 · 335 阅读 · 0 评论 -
素数线性筛(O(N)!!!)
我们先来看一下最经典的埃拉特斯特尼筛法。时间复杂度为O(n loglog n) int ans[MAXN]; void Prime(int n) { int cnt=0; memset(prime,1,sizeof(prime)); prime[0]=prime[1]=0; for(int原创 2017-05-26 17:57:18 · 342 阅读 · 0 评论 -
H数
如果i是H素数,那么5i+4i*x一定是H数且不是H素数 预处理处所有的H素数就可以啦 题目#include <cstdio>#include <iostream>using namespace std;const int H_MAX=1000001+16;int f_prime[H_MAX],mix_prime[H_MAX];int H_prime[H_MAX];int cnt[H原创 2017-05-24 16:14:02 · 1121 阅读 · 0 评论 -
P1984_[SDOI2008]烧水问题
QAQ 设烧开一杯水的热量是a 第一杯水中和为0,加热为a 第二杯水中和为a/2,加热为a/2 第三杯水中和为(a/4+a)/2=a*5/8,加热为a*3/8 第四杯水为((a/8+a*5/8)/2+a)/2,加热为a*5/16 前后比值,t(n+1)/t(n)=(1-2*n) 所以t(n+1)=t(n)*(1-2*n)#include <iostream>#include <cst原创 2017-08-10 20:55:09 · 282 阅读 · 0 评论 -
P1134 阶乘问题
QAQ 设定一个范围,删除后置0,由于0太多,为保证精度,需要保留9位数才可以行#include <cstdio>#include <iostream>using namespace std;long long cf(long long x){ if(x<10) return x; while(!(x%10)) x/=10; return x%100000原创 2017-08-11 08:33:09 · 215 阅读 · 0 评论 -
na(斐波那契数列对于的模的周期性)
题目大意:求F(F(N))0<=N<=10E100答案对1e9+7取模这咋求呢,单纯的一个斐波那契数列我们可以用矩阵快速幂来求,但是对于第一层的F(N)我们是需要一个精确值的!咋办? 用到一个性质! 如果我们对斐波那契数列进行取模,那么这个数列就变成了一个周期数列!(不知道周期数列的自己百度) PS:我不会证明,找数学竞赛党吧 但是定理没有给出T与模数的关系。。。。 咋整? 我们可原创 2017-09-24 16:58:38 · 3208 阅读 · 0 评论 -
Flower
1.花(flower.cpp/c/pas)【问题描述】商店里出售n种不同品种的花。为了装饰桌面,你打算买m支花回家。你觉得放两支一样的花很难看,因此每种品种的花最多买1支。求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值。【输入格式】一行3个整数n,m,p,意义如题所述。【输出格式】一个整数,表示买花的方案数。【输入输出样例1】flower.in 4 2 5原创 2017-09-13 16:13:02 · 347 阅读 · 0 评论 -
组合数问题
数据范围,我擦,看来查询只能O(1)啊 咋办啊 首先考虑,将C(n,i)*C(n,i)换成C(n,i)*C(n,n-i)。 这样的话,就是对于每个i,计算n个中选i个的方案数乘上n个中选(n-i)个的方案数,最后累加起来。 这样得到的答案,实际上相当于2n个物品,在前n个中选i个,在后n个中选(n-i)个, 又由于i取遍0~n所有整数,那么累加后方案数就等于C(2n,n)。 所以原创 2017-08-23 17:11:35 · 522 阅读 · 0 评论 -
铺瓷砖
看似好像是最小公倍数,BUT分数怎么会有最小公倍数呢 问题的实质是要我们求两个分数的最小公倍数。 首先,我们要知道,整数a和b的最小公倍数是a*b/gcd(a,b); 那么怎样来求分数的最小公倍数呢? 我们可以先将两个分数通分,分母变为t1,然后再求分子的最小公倍数t2。 那么答案就是t2/t1, 注:最后要约分原创 2017-08-15 20:47:38 · 483 阅读 · 0 评论 -
三角形
先将全部直线算出来,是c(n,3) 然后把不符合要求的平行线的情况去掉即可#include <cstdio>#include <iostream>#include <map>#include <algorithm>using namespace std;double num[9999999];long long sum,cnt;long long tot;long long len原创 2017-08-21 14:30:27 · 244 阅读 · 0 评论 -
P1595 信封问题
QAQ 一个错排问题。 递推公式 D(1)=0,D(2)=1。 D(n)=(n-1)(D(n-1)+D(n-2)) 通项公式 f(n) = n![1-1/1!+1/2!-1/3!+……+(-1)^n*1/n!] 解释: n 个不同元素的一个错排可由下述两个步骤完成: 第一步,“错排” 1 号元素(将 1 号元素排在第 2 至第 n 个位置之一),有 n - 1 种方法。 第二原创 2017-08-19 15:12:46 · 295 阅读 · 0 评论 -
P1720 月落乌啼算钱
传送门 自已一看式子,这不是斐波那契数列的通项公式吗,n<=42,还是递推吧#include <cstdio>#include <iostream>using namespace std;double fb[9999];void fb1(){ fb[0]=0,fb[1]=1; for(int i=2;i<=48;i++) fb[i]=fb[i-1]+fb[i-2];原创 2017-08-11 20:45:16 · 376 阅读 · 0 评论 -
阶乘之和
QAQ a数组储存当前阶乘的值 b数组为临时数组 c数组为阶乘和数字 然后先高精乘,在高精加即可 注意倒叙输出#include <cstdio>#include <iostream> #include <cstring>using namespace std;int a[9999];int b[9999];int c[9999];void adx(int k){ fo原创 2017-08-11 19:51:22 · 198 阅读 · 0 评论