摘要:题目:问题描述 给定n个十六进制正整数,输出它们对应的八进制数。输入格式 输入的第一行为一个正整数n (1#include#includeusing namespace std;int getDigit(char c){ if(c=='0') return 0; else if(c=='1') return 1; else if(c=='2') return 2; else if(c=='3') return 3; else if(c=='4') return 4; else if(c=='5')
阅读全文
摘要:题目地址:zoj5194题目大意: 给你b, n, 问以b为进制,n位1111.....排成的数是不是素数。一开始不知道怎么判断“感觉这么大的数”,额,直接先打出来试一下看看long long 够不够存嘛。发现只有16 16这一组超过范围了。那么这一组或者是素数或者不是 交两发试一下 或者用BigInteger算一下就好了。代码:#include#includeusing namespace std;typedef long long inta;bool is_prime(inta n){ for(int i=2;i>b>>n) { if(judge[b][n]...
阅读全文
摘要:题目地址:cf#232_div2_D题目大意:u(n)是不超过n的最大素数,v(n)是大于n的最小素数。 然后求一个和。额,sb了试几个数就会发现就是列项求和。 然后对n是否是素数判断一下就可以了。注意两个10^9 的数相乘会爆int ,要用long long 存储代码:#include#includeusing namespace std;int is_prime(long long n){ for(int i=2;i1;i--) { if(is_prime(i)) return i; } return 2;}int main(){ int c...
阅读全文
摘要:题目地址:cf#232#div2#c题目大意:给定正整数n,然后给你n个数,我们只需要这n个数的乘积,然后问可以分解成多少种n个数的乘积形式。实际上就是先进行素因数分解,然后分配这些指数到n各地方去,即是n元不定方程的非负整数解问题。然后就是组合数打表。 用map进行指数统计。其中素数表只用打到10 ^5 到10^6 不超时但是很浪费代码:#include#include#include#includeusing namespace std;const int mod=1000000007;int p[1000005];vector prime;void make_prime(){ ...
阅读全文
摘要:题目地址:cf#232#div2#B题目大意:告诉你l,r,你现在有l,l+1,l+2.....r 这么多种面值的钱,每种面值的钱有很无数张,问你是否可以表示出给定的n这么大的面值。初一看是一个不定方程的非负整数解是都有解问题 。 经过@eyelids的提示,只需要找到一个整数x,使得n落入【lx,rx】 这个区间就可以了。这里详细说一下,一旦找到了x,那么我们先取出x枚面值为l的硬币,然后逐步调整,每次改变当前面值最小的的硬币+1,这样,只要没有全部是r,总能继续调整,于是区间【lx,rx】上的数全部被连续表示了。 所以这样就可以调整出一种表示方式。反之,如果找到了一种表示方式,取出硬币数量
阅读全文
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3221思路 首先列出n比较小的一些,找到规律,指数就是fibonacci数列,也不难由函数递归的形式猜出。然后如果n#include#include#include#include#define N 1000000using namespace std;typedef long long inta;int fi[40];int prime[N+5];vector primev;int fi_mod[N+5];void pre(){ fi[0]=1; fi[1]=1; for(int ...
阅读全文
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4627[a,b]=ab/(a,b) a,b和一定时,越接近乘积越大,在接近的同时,尽量保持公因子最少。 如果n为2*k+1 那么 取a=2k,b=2k+1 最佳。 如果n为偶数=2k,就要进一步分k的奇偶性了。 n=4k 时 显然2k+2k会很小 2k-1,2k+1 就满足了 (2k-1,2k+1)=(2,2k+1)=1 。 如果n=4k+2 ,逐一实验2k+1,2k+1。 2k 2k+2. 2k-1,2k+3 。发现2k-1,2k+3是最佳的,而且他们已经互素了,再增大差距结果不会优于这组。 ..
阅读全文
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4722考虑怎样的数可以成为good number ,如果不给范围,取一个n位数 (最高位-1)*10*10....最后一位由前面的和决定。 首先不考虑0基于这样的思想 比如不超过54321的good number 有多少 ,1~4位有9+9*10+9*10*10(等比求和) 5位就是4*10*10*10+ 第一位是5 剩下的部分mod10==5,而且不超过4321这样就可以设计递归了。然后就是递归函数设计中 应该是long long的始终不要丢失精度 , 第二个参数递归下降时 不忘+10 再去mo.
阅读全文
摘要:题目地址:http://poj.org/problem?id=3844思路: a[i]+a[i+1]+...+a[j]=s[j]-s[i]; 于是整除等价于 s[i]===s[j] (mod d); 然后统计出现了多少次 c[n][2]就可以了 。 值得注意的是,有可能50000* (50000-1)/2 要用long long每次进入一个新case 后把p 清零,sum【i】表示前i个数的和, 0=#include#includeusing namespace std;int sum[50005];int p[1000000];int main(){int T;cin>>T;in
阅读全文
摘要:题目地址:http://poj.org/problem?id=3842 或者:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2610思路就是暴力求出每一种可能的情况,进行全排列(next_permutation可以去重)然后对每一种排列考虑前面的子串。为了防止一个情况被考虑两次,设置一个占位符b[10000000] 每次新输入数,记得将b清空,然后先转化成int数组,每次翻译成一个int时快一些。这个代码在Uva
阅读全文
摘要:题目地址:http://poj.org/problem?id=2689题目思路: 找出int 内所有素数空间上时不允许的,但是题目要求l ,u的差不超过100w ,在空间上还是允许的。然后先找出5w以内的素数,这样的可以中这些素数作为合数最小的素因子将这个合数筛掉。 几个要注意的地方 【1】 因为l可能很大,j的起点不能去“p*p” 然后比L小就加一个p,想一下如果p=2,l很大会花很多时间的。 【2】 然后就是这个j 要用long long 存 ,因为我们找到的j的初值是p 的倍数中第一个大于等于L的,l很大时可能超long long。 【3】 这个筛法筛去的第一个数是4 所以1要特判 ..
阅读全文
摘要:题目地址:http://acm.sgu.ru/problem.php?contest=0&problem=499分析思路: 直接计算两两的最大公约数会超时的,我们换个角度看问题,我们找到输入进来的数的所有约数,如果某个数出现了两次或者以上,那么满足条件的最大的就是ggcd了然后就是类似于筛法找约数, 这样可以找到 1~n中,每个数不超过自己平方根的所有约数。 然后比平方根大的那个可以用它除出来(完全平方数要特判了)。然后不是暴力直接从最大的开始找出现过两次的,我们设置一个maxn来记录就好了,每次第二次出现的数和maxn比较一下就可以了。先看代码:#include#include#in
阅读全文
摘要:题目地址:http://poj.org/problem?id=3233思想: 1模仿快速模幂法 ; 给矩阵写一个快幂 2 但是k太大 直接求和还是会tle 这个很像等比数列求和 但是可以递归用二分求,理论基础如下 : 求和二分:A+A^2+A...+A^(2k+1)= A+A^2+...+A^k+A^(k+1)+A^(k+1)*(A+A^2+...+A^k). 3 矩阵用结构体存储很好用呀 之前用int **存好像容易超内存 或者时间效率不高 4递归函数设计时,把调用递归的放在前面,这样实现自动回溯,而且不会爆栈 5 用g++...
阅读全文
摘要:#includeusing namespace std;int quick_mod(int a,int b,int m){ a=a%m; int ans=1; while(b) { if(b&1) { ans=(ans*a)%m; } b>>=1; a=(a*a)%m; } return ans;}int main(){ int size; cin>>size; int m; int h; int a,b; while(cin>>m) { cin>>h; int ans...
阅读全文
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1788说明: 题目很水 提到一个定理,求多个数的最小公倍数转化为求两个数的最小公倍数方法。 然后就是 a=b(mod m1) a=b(mod m2) 等价于a=b(mod [m1,m2] )#includeusing namespace std;typedef long long inta;int gcd(int a,int b){ if(b==0) return a; else return gcd(b,a%b);}int main(){ int k,a; while(cin>>k&g
阅读全文