
----数论----
算球?
在校学生
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Codeforces Round #368 (Div. 2) C. Pythagorean Triples
题解中就在评论中给了个公式,不过评论中有人给了一个证明连接:http://codeforces.com/blog/entry/46681看到毕达哥斯拉三元组,我想到一个题:poj 1305,这个题是枚举来做的,cf这题我也就枚举试了下,不行。。。 我的写法是看的别人结论: 当n被4整除时,结果是n/4 * 3和n/4 * 5 当n被2整除时,结果是((n/2) * (n/2)/2) * 2和(原创 2017-11-04 17:26:58 · 405 阅读 · 0 评论 -
Codeforces Round #364 (Div. 2) D As Fast As Possible
参考:http://blog.youkuaiyun.com/acm_fighting/article/details/52003538#include <bits/stdc++.h>using namespace std;int main(){ int n,k; double l,v1,v2; cin >> n >> l >> v1 >> v2 >> k; int g = n/原创 2017-10-02 20:33:11 · 198 阅读 · 0 评论 -
51nod 1110 距离之和最小 V3
把权值为x的一个点,当成x个权值为1的点。#include <bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN = 10010;struct Point{ LL x,val; bool operator < (const Point& b) const { re原创 2017-09-28 16:16:51 · 223 阅读 · 0 评论 -
poj 1305 Fermat vs. Pythagoras(毕达哥斯拉三元组)
毕达哥斯拉三元组,即勾股数组。 勾股数组参考资料:http://blog.youkuaiyun.com/magicnumber/article/details/6410043 s的取值范围:3≤s≤√(2n-1),假设t取最小值,s就是这个范围。具体请查看参考资料。#include <stdio.h>#include <string.h>#include <algorithm>#include <ma原创 2017-09-22 23:20:55 · 514 阅读 · 0 评论 -
51nod 1717 好数
并没怎么想,看了几遍题目,没看懂啥意思,就搜题解了,题解竟然都没说题目啥意思,上来就说解法,然后就结合着题解看懂了题目意思。 有n个数 a[1],a[2],…,a[n]开始都是0 现在进行操作t,操作t的范围是1-n,t=1,翻转所有下标是1的倍数的位置。t=2,翻转所有下标是2的倍数的位置。直到t=n。最后翻转完,如果某个下标那里的数字是0,则下标是好数。翻转偶数次是0,翻转奇数次是1.只有原创 2017-09-14 21:37:22 · 307 阅读 · 0 评论 -
51nod 1419 最小公倍数挑战
任意两个相邻的正整数互质:假设n和n+1的gcd=d,则d整除(n+1)-n,则d整除1,d=1 任意两个相邻的奇数互质:假设n是奇数,则gcd(n,n+2)=d一定是奇数,因为d|2,所以d=1 当n<=2的时候,结果就是n n>=3的时候 n为奇数的话,结果是n*(n-1)*(n-2),三个数两两互质 n为偶数的话,n*(n-1)(n-2)就不行了,n和n-2的gcd=2,但是n(n-原创 2017-09-14 20:23:56 · 316 阅读 · 0 评论 -
51nod 1179 最大的最大公约数
直接分解出因子,统计一下就好了#include <bits/stdc++.h>using namespace std;const int MAXN = 50010;map<int,int> res;int main(){ int n,num; scanf("%d",&n); while(n--) { scanf("%d",&num);原创 2017-09-05 19:26:00 · 201 阅读 · 0 评论 -
51nod 1108 距离之和最小 V2(中位数)
看了下讨论版才发现,三个维度互相不影响啊,那就是三个一维的了。那和51nod 1096 距离之和最小 就没啥差别了#include <bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN = 10010;int x[MAXN],y[MAXN],z[MAXN];int main(){ ios::syn原创 2017-09-05 18:17:11 · 305 阅读 · 0 评论 -
51nod 1035 最长的循环节
做题之前先看论文:http://w3.math.sinica.edu.tw/math_media/d253/25311.pdf 在论文中(二)那里讲的求循环节位数,拿来直接用就搞定了http://blog.youkuaiyun.com/acmore_xiong/article/details/53841575我看这个写的也挺详细。#include <bits/stdc++.h>using namespace原创 2017-07-26 22:59:08 · 270 阅读 · 0 评论 -
poj 3292 Semi-prime H-numbers
模仿埃氏筛法走一发。#include <stdio.h>#include <string.h>const int MAXN = 1001000;int isPrime[MAXN];int prime[MAXN];int mark[MAXN];int cnt[MAXN];int plen = 0;void init(){ for(int i = 5; i < MAXN; i +=原创 2017-10-06 16:25:59 · 215 阅读 · 0 评论 -
hihocoder 1296 : 数论三·约瑟夫问题
#include <bits/stdc++.h>using namespace std;const int MAXN = 1010;int f[MAXN];int solve(int n, int k){ if(n == 1) return 0; int ret; if(n < k) { ret = 0; for(原创 2017-10-21 21:08:40 · 278 阅读 · 0 评论 -
poj 2891 Strange Way to Express Integers(一元线性同余方程组)
迭代求解方程组,拿板子就好了#include <stdio.h>typedef long long LL;const int N = 11110;LL M[N], R[N];LL gcd(LL a, LL b){ return !b ? a : gcd(b, a%b);}LL extgcd(LL a, LL b, LL &x, LL &y){ LL d = a;原创 2017-11-13 20:34:21 · 400 阅读 · 0 评论 -
hdu 3579 Hello Kiki(一元线性同余方程组)
和hdu 1573基本一样。注意不能输出0,是最小正整数解#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 110, INF = 0x3f3f3f3f;int M[N], R[N];int gcd(int a, int b){ return !b ? a : gcd(b, a%b)原创 2017-11-12 14:22:04 · 360 阅读 · 0 评论 -
hdu 1573 X问题(一元线性同余方程组)
当中国剩余定理中的那些模数不互质的时候怎么解?就像解普通方程组一样,迭代求解同余方程组。思路很简单。过两天重新写个,换掉这个抄来的模板。 代码是直接拿的模板,改都没改:http://blog.youkuaiyun.com/discreeter/article/details/70318677#include <bits/stdc++.h>using namespace std;typedef long lon原创 2017-11-11 19:28:03 · 405 阅读 · 0 评论 -
hdu 1222 Wolf and Rabbit(gcd)
兔子是否能活下来,就看狼能不能走遍所有的洞了。如果狼能走遍所有的洞,兔子就死定了。n是洞的个数,m是狼的步长。假设狼走了x步,走到了位置k,则位置k=x*m%n,则k =x * m - (x * m/n) * n,即k =x * m + y * n,当前洞口位置是m和n的线性组合,所以 gcd(n,m) | k。m和n的所有线性组合构成的集合与所有的gcd(n,m)构成的集合相同,即位置k的集合和g原创 2017-11-01 21:57:05 · 392 阅读 · 0 评论 -
51nod 1189 阶乘分数
分解质因子,求出约数个数n,然后(n+1)/2,因为x<=y,所以要除以2#include <bits/stdc++.h>using namespace std;using LL = long long ;const LL mod = 1e9+7;const int MAXN=1000001;int cnt[MAXN];int prime[MAXN+1];void getPrime()原创 2017-10-15 21:50:11 · 272 阅读 · 0 评论 -
51nod 1350 斐波那契表示(规律)
或许我是为数不多的找到规律却实现不出来的。。。 代码参考:http://blog.youkuaiyun.com/jaihk662/article/details/60896217 规律还是比较好找的,把F函数的值算出几十项来就很好观察了。1 1 F(1)1原创 2017-10-14 15:06:23 · 320 阅读 · 0 评论 -
51nod 1225 余数之和
这题就是求∑n1n−(n/i)∗i=n∗n−∑n1(n/i)∗i\sum_{1}^{n}n-(n/i)*i = n*n-\sum_{1}^{n}(n/i)*i。比如说:n=20,n/11=1,n/20=1n=20,n/11=1,n/20=1,这样就可以分段来求解了。即某一段内的x,n/x的值都是相等的。某一段的开头是i,则这一段的结尾就是n/(n/i),然后n/(n/i)+1为下一段开头,一直到n。原创 2017-10-13 22:00:16 · 357 阅读 · 0 评论 -
51nod 1586 约数和
可以通过b数组来找到a数组和c数组的关系。假设现在更新a[x],求c[y],只要找到一个a[x]对c[y]贡献了多少次即可。b对c产生直接的贡献。则c[y]来自b的贡献就是y的因子的个数,在y的这些因子中,如果他是x的倍数,则有一次a[x]的贡献,则y的因子中有多少因子是x的倍数,a[x]就对c[y]贡献了多少次,y的因子中有y/x个数是x的倍数,所以a[x]对c[y]贡献了y/x次。约数的个数是s原创 2017-10-13 21:31:34 · 237 阅读 · 0 评论 -
51nod 1537 分解(矩阵快速幂)
参考:http://blog.youkuaiyun.com/qingshui23/article/details/52350523 标程中提到了构造对偶式,我去,这咋整啊,搞不了 但是就根据标程来推,这些东西都能推出来。。。 奇偶都能推出来sqrt(m)+sqrt(m−1)=a+b∗sqrt(2) 然后根据(1+√2)^n=a+b∗2打个表,找规律就好了。找不到规律的话,拿着序列去oeis一查就知道了#原创 2017-08-08 16:30:00 · 377 阅读 · 0 评论 -
51nod 1096 距离之和最小
把点从小到大排序,如果是奇数个点,中间那个点就是要求那点,偶数个点,中间俩点之间的区间都可以是要求的那点。假设有n个点,n为偶数。(1,n),(2,n-1)…(n/2,n/2+1),这n/2线段的长度和就是结果了。#include <bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN = 10010;LL原创 2017-07-26 22:48:43 · 267 阅读 · 0 评论 -
LightOJ 1213 Fantasy of a Summation
思路:观察后可以发现,这段代码计算的就是((a[1]+a[2]+…+a[n])*k*n^(k-1))%mod#include <iostream>#include <algorithm>using namespace std;typedef long long ll;ll pow(int a, int b, int m){ ll res = 1; while(b) {原创 2017-04-17 13:43:57 · 252 阅读 · 0 评论 -
LightOJ 1214 Large Division
大数取余#include <cstdio>#include <cstring>const int MAXN = 210;char str[MAXN];char *snum;long long num;bool solve(){ int len = strlen(snum); long long res = 0; for(int i = 0; i < len; +原创 2017-04-17 12:55:16 · 254 阅读 · 0 评论 -
LightOJ 1234 Harmonic Number
10^8,打表开这么大数组肯定不行。所以开小点喽,我是开了10^8/40这个大的数组,数组第一个元素存储1~1/40,第二个元素存储1~1/80,分母每次+40,这样在计算n的时候,就可以直接从表里找到1~1/((n/40)*40)的和,然后在枚举1/((n/40)*40)~1/n,计算家和,也就枚举39次。。。。。不看别人博客我还想不到这样存储。。。。。#include <cstdio>#inc原创 2017-04-16 19:49:16 · 248 阅读 · 0 评论 -
uva 10200 Prime Time
水题,不过有坑,在输出答案的时候加个1e-5就过了,不加就是wa#include <iostream>#include <cstring>#include <algorithm>#include <iomanip>#include <cstdio>using namespace std;typedef long long ll;const int MAXN = 10010;bool b原创 2017-04-15 15:47:53 · 381 阅读 · 0 评论 -
LightOJ 1245 Harmonic Number (II)
这题我是找的规律,举个例子:10/1=10,10/2=5,10/3=3,10/4=2,10/5=2,10/6=1,10/7=1,10/8=1,10/9=1,10/10=1。 10/2到10/1都是1,10/3到10/2都是2,10/4到10/3都是3,当10/n到10/(n-1)的时候就开始直接循环枚举,例如10/4到10/3中间只差一个元素,则从10/3往后每个区间就只有一个元素了,对应于这里的原创 2017-04-14 15:16:03 · 277 阅读 · 0 评论 -
LightOJ 1259 Goldbach`s Conjecture
直接打表暴力找就可以,不过有个坑,要用bool数组标记,用int数组标记会超内存。。mle了好多发,看别人博客说要用bool标记才可以,,以后不用int标记了#include <cstdio>#include <cstring>#include <cmath>const int MAXN=1e7+5;int prime[700000];bool book[MAXN];void getPri原创 2017-04-14 14:25:15 · 268 阅读 · 0 评论 -
LightOJ 1282 Leading and Trailing
题意:给你n和k,求出n^k的前3位和后3位数字。后三位输出的时候一定要输出三位,比如1000000要输出000,不然会wa 思路:求后三位直接快速幂取模就行,求前三位:求前三位则需要一些数学知识,对于给定的一个数n,它可以写成10^a,其中这个a为浮点数,则n^k=(10^a)^k=10^a*k=(10^x)*(10^y);其中x,y分别是a*k的整数部分和小数部分对于t=n^k这个数,它的位数原创 2017-04-14 13:03:54 · 246 阅读 · 0 评论 -
poj 1061 青蛙的约会(扩展欧几里得解不定方程)
设两只青蛙跳了t步,A的坐标为x+mt,B的坐标为y+nt,他们相遇的时候满足x+mt-(y+nt) = pL(p表示两青蛙走过的路程相差p圈) 移项后:(n-m)t+Lp=x-y 设n-m为A,x-y为B,则At+Lp=B,,求满足这个式子的最小t,也就是求一次同余方程At=B(mod L)的最小整数解。求出GCD(A,L),如果B%GCD(A,L)!=0,则无解。解出的t也可能是负数,要转原创 2017-03-22 15:31:23 · 724 阅读 · 0 评论 -
LightOJ 1197 Help Hanzo
思路:大区间素数筛 筛法用的kuangbin的模板#include <cstdio>#include <algorithm>#include <iostream>#include <cstring>using namespace std;typedef long long ll;const int MAXN=1000010;int prime[MAXN+1];void getPri原创 2017-04-17 15:59:33 · 352 阅读 · 0 评论 -
hdu 5109 Alexandra and A*B Problem
思路:做题的时候完全没思路。。。。看了题解才有。。。说说我的理解。。 串S是串T的子串,串T应该就是xSy的形式,x接在S前,y接在S后,构成了串T。A*B=T,设S的长度为p,y的长度为q,则A*B=(x*10^p+S)*10^q+y。 T%A=0,即((x*10^p+S)*10^q+y)%A=0,对于x的范围,可以通过取模运算缩小到[0~a),如果S的开头为0的话,则x的范围是[1~a-1]原创 2017-04-22 20:06:53 · 363 阅读 · 0 评论 -
51nod 1247 可能的路径
逆向思维,先证明点p1可以到点p2,然后可以从p2返回p1。然后找一点m,如果点(a,b)可以到达m,并且点(x,y)也可以到大m,则(a,b)可以到达(x,y) 相关讨论里给的证明: 给个不太严谨的证明思路: 第一步:证明路径可逆,也就是如果(a, b) -> (x, y)可行,则(x, y) - > (a, b)可行 这个比较直观,只需要分别由(a +b, b) (a, a + b),原创 2017-07-30 00:00:20 · 313 阅读 · 0 评论 -
51nod 1013 3的幂的和
等比数列前n项和,快速幂取模,逆元#include <bits/stdc++.h>using namespace std;typedef long long LL;const LL MOD = 1e9+7;LL MODPOW(LL a, LL b){ LL res = 1; while(b) { if(b&1) res = res*a%MOD;原创 2017-07-26 22:40:17 · 235 阅读 · 0 评论 -
51nod 1629 B君的圆锥
推推就出来了#include <bits/stdc++.h>using namespace std;int main(){ double s; double pi = acos(-1); cin >> s; double r2 = s/(4*pi); double ninev2 = s*s*r2-2*s*pi*r2*r2; cout << fixe原创 2017-07-25 23:02:24 · 234 阅读 · 0 评论 -
51nod 1873 初中的算术
BigDecimal大法好import java.util.*;import java.math.*;public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); String str = cin.next();原创 2017-07-25 22:52:54 · 474 阅读 · 0 评论 -
51nod 1433 0和5
各个位上的数字加和能被9整除,这个数就能被9整除,然后只要再在后边加个0,就可以被90整除了。 以前只知道3,看来要也要看看其他数字的倍数特性了#include <bits/stdc++.h>using namespace std;const int MAXN = 1010;int num;int zero;int five;int main(){ ios::sync_with_原创 2017-07-25 22:51:29 · 169 阅读 · 0 评论 -
51nod 1435 位数阶乘
把每一位数分解成好几个数,使得这一个数的阶乘和那好几个数阶乘的乘积相同。数分的越长越好,最终也就只能分成好几个素数。素数没法分。比如9分成7332, 9! = 7! * 3! * 3! * 2!#include <bits/stdc++.h>using namespace std;char str[20];vector<int> res;int main(){ int n;原创 2017-08-09 23:11:18 · 259 阅读 · 0 评论 -
51nod 1138 连续整数的和
等差数列前n项和公式:S = na1+n(n-1)/2,a1 = (S-n(n-1)/2)/n,可以求出n的范围大概就是[2,sqrt(2*S)],枚举序列长度n,然后求解a1。using System;using System.IO;using System.Numerics;namespace timeless{ class Program { static原创 2017-07-24 15:17:15 · 229 阅读 · 0 评论 -
51nod 1536 不一样的猜数游戏
任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积 ,如:n=p1^a1p2^a2…pn^an 如果某个数子是p的倍数,你无法知道这个数字是p^x或者p^y,所以要把p在n范围内的每个倍数都要询问一次,每个素数都要这样询问,这样就可以确定1-n的任意一个数字了。#include <bits/stdc++.h>using namespace std;const int原创 2017-08-05 16:47:18 · 392 阅读 · 0 评论 -
51nod 1116 K进制下的大数
O(35*n),暴力跑一趟就过了。 就是个大数取模。。。 还可以O(n)过,过段时间还要看看O(n)的解法#include <bits/stdc++.h>using namespace std;const int MAXN = 1e5+10;int num[MAXN];int nlen;int maxn;//确定最小是几进制bool solve(int k){ int rema原创 2017-07-31 21:24:37 · 221 阅读 · 0 评论