数论
呆呆与笨笨
梦想是被追逐的,而不是幻想的
展开
-
九度 1076 N的阶乘(模拟)
#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;int s[10010];int main(){ int n,m,i,t; while(~scanf("%d",&n)){ memset(s,0,sizeof(s));原创 2015-03-28 08:54:38 · 362 阅读 · 0 评论 -
hdu 1722 Cake
公式:p+q-gcd(p,q)先把蛋糕分成q份,然后把蛋糕拼在一起,然后再分成p份。 分成q份需要切q刀,分成p份需要切p刀,但是会有重复,减去重复的部分就是gcd(p,q)原创 2014-07-26 16:57:20 · 391 阅读 · 0 评论 -
hdu 1701 ACMer(水题)
ACMer人数在P%和Q%之间,那么P%的人与Q%的人就不能相同,因为一个是至少,一个是至多。另外注意浮点数的陷阱。原创 2014-07-26 10:09:03 · 519 阅读 · 0 评论 -
hdu 1060 Leftmost Digit(幂次方最高位)
转自网上牛人解题报告)题目大意是输入N,求N^N的最高位数字。1估计大家看到N的范围就没想法了。确实N的数字太大,如果想算出结果,即使不溢出也会超时。题目是这样转化的。首先用科学计数法来表示 N^N = a*10^x; 比如N = 3; 3^3 = 2.7 * 10^1;我们要求的最右边的数字就是(int)a,即a的整数部分;OK, 然后两边原创 2014-07-26 09:42:52 · 523 阅读 · 0 评论 -
hdu 2045 不容易系列之(3)—— LELE的RPG难题(递推)
考虑长为n的串,以s[i]表示i位的字符。1.若前n-1位组成的串合法,则由于首尾不同,再添加一位时,只有1种方法;即s[n] = s[n-1] 2.若前n-1位组成的串不合法,再添加一位后合法,即因为首尾相同而引起的不合法,那么前n-2位组成的串必定合法。此时第n位有2种添加方法。即s[n] = 2*s[n-2]3.边界条件:f(1)=3;f(2)=6;f(3)=6。原创 2014-07-25 20:31:05 · 351 阅读 · 0 评论 -
南阳 105 9的余数
解题思路: 弃九法#include#includechar s[1000010];int main(){ int n,m,i,sum; scanf("%d",&n); while(n--) { scanf("%s",s); m=strlen(s); for(sum=i=0;i<m;i++)原创 2014-01-06 22:24:42 · 782 阅读 · 0 评论 -
hdu 1999 不可摸数(朴素打表法求质因子之和)
#include#include#define N 1000000using namespace std;int num[N+10]={0},sum[1010]={0};int main(){ int n,t,i,j; for(i=1;i<=N/2;i++){ for(j=2*i;j<=N;j+=i){ num[j]+=i;//把每一个质因子都计算进去 } } f原创 2014-07-24 21:14:08 · 604 阅读 · 1 评论 -
hdu 1286 找新朋友(欧拉函数)
欧拉函数#includeint Eular(int n){ int t=n,i; for(i=2;i*i<=n;i++){ if(n%i==0){ while(n%i==0){ n/=i; } t=t/i*(i-1); } } if(n>1) t=t/n*(n-1); return t;}int main(){原创 2014-07-04 17:17:38 · 371 阅读 · 0 评论 -
hdu 1212 Big Number(大数取模)
#include#include#include#include#includeusing namespace std;int main(){ int t,n,i; char s[1010]; while(~scanf("%s%d",s,&n)){ for(t=i=0;s[i];i++){ t=(t*10+s[i]-'0')%n; } printf("%d\n"原创 2014-07-24 13:57:57 · 425 阅读 · 0 评论 -
hdu 4548 美素数(筛选法求素数)
#include#includeusing namespace std;int num[1000010]={0},sum[1000010]={0};void prime(){ int i,j; num[0]=num[1]=1; for(i=2;i<=1000;i++){ if(!num[i]){ for(j=i*i;j<=1000000;j+=i)原创 2014-07-24 08:57:36 · 459 阅读 · 0 评论 -
hdu 1019 Least Common Multiple(几个数的最小公倍数)
#include#include#include#includeusing namespace std;int gcd(int a,int b){ return !b?a:gcd(b,a%b);}int main(){ int t,n,i,j; long long s; int num[1010]; scanf("%d",&t); while(t原创 2014-07-26 16:16:39 · 399 阅读 · 0 评论 -
正整数分拆使乘积最大
转自:若干个正整数的和为S,求它们乘积的最大值F(S).其实这是一个分解的问题,给定的S,分解成若干个正整数的和,然后求乘积的最大值。S=a[1]+a[2]+…+a[n],F(S)=a[1]a[2]…a[n]根据局部调整法分析所得到的A-G不等式,可以认为把S分成的都相等的n份是最好的,如果不能均分也应当使每个数尽量接近。下面是题解,从每个a[k]的大小入手:1)不可能存在转载 2014-07-28 11:57:34 · 1518 阅读 · 0 评论 -
poj 1032 Parliament(正整数拆分不同数使乘积最大)
求一组数2,3,...,w1>.如果它们的和等于n,那么这组数就是使得乘积最大的数。2>如果它们的和为sum,且n-sum==w,那么使得乘积最大的数为3,4,...,w,w+2,即前面几个数加1,最后一个数加23>如果它们的和为sum,且n-sum证明:原创 2014-07-28 11:52:09 · 725 阅读 · 0 评论 -
poj 1647Sorting by Swapping
#include #include #include #include using namespace std;int num[10010];int main(){ int t,n,m,i,s,j; scanf("%d",&t); while(t--){ memset(num,0,sizeof (num)); scanf("%d"原创 2014-08-15 21:35:32 · 586 阅读 · 0 评论 -
hdu 4952 Number Transformation(数论)
题意:给你个x,k次操作,对于第i次操作是:要找个nx,使得nx是>=x的最小值,且能整除i,求k次操作后的数原创 2014-08-14 20:05:29 · 433 阅读 · 0 评论 -
hdu 2522 A simple problem(模拟)
#include#include#include#includeusing namespace std;int a[100010],b[100010];int main(){ int n,m,t,j,s,i; scanf("%d",&t); while(t--){ memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); scanf(原创 2014-08-09 18:29:55 · 374 阅读 · 0 评论 -
poj 3070 Fibonacii(矩阵乘法求Fibonacii)
题意:求第n个斐波那契数。思路:矩阵快速幂。利用,可化为矩阵快速幂,即:由于矩阵乘法具有结合律,因此对于矩阵A,有A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2。我们可以得到这样的结论:当n为偶数时,A^n = A^(n/2) * A^(n/2);当n为奇数时,A^n = A^(n/2) * A^(n/2) * A (其中n/原创 2014-07-31 20:56:55 · 578 阅读 · 0 评论 -
hdu 1799 循环多少次(DP,排列组合Cn(m))
抽象出来是排列组合题目从n个数里面选择m个数、按递增方式放在每一层循环郁闷、高中的公式都忘了 Cn(m)=C(n-1)(m-1)+C(n-1)(m)DP状态转移方程:原创 2014-07-31 10:23:13 · 748 阅读 · 0 评论 -
hdu 2^x mod n = 1(同余定理+暴搜)
#includeint main(){ int n,m,i,j; while(~scanf("%d",&n)){ if(n==1||n%2==0) printf("2^? mod %d = 1\n",n); else{ long long m=1; for(i=1;;i++){ m*=2; m%=n; if(m==1) break; }原创 2014-07-31 09:45:50 · 558 阅读 · 2 评论 -
hdu 2277 Change the ball(找规律)
题意:有三种球,每两种球各一个可以变换成第三种球两个。这种规则不能反过来使用,求最少的步数能够把三种球换成1种球。题解:首先考虑三种球(a、b、c)的各种情况:第一种情况:a==b!=c(即有两种球数量相等)此时答案为:a;第二种情况:a==b==c(即三种球数量都相等) 此时答案为:a;第三种情况:全转化为a或全转化为b或者全部转化为c,他们能够转化成功的条件为:c-b是3的原创 2014-08-05 09:39:44 · 583 阅读 · 0 评论 -
hdu 4861 Couple doubi(费马小定理)
费马小定理:假如p是质数,且(a,p)=1,那么 a^(p-1) ≡1(mod p)。即:假如a是整数,p是质数,且a,p互质,那么a的(p-1)次方除以p的余数恒等于1。原创 2014-07-24 20:42:47 · 582 阅读 · 0 评论 -
poj 2229 Sumsets(递推&整数划分变形)
求把一个整数分解为2的幂的和共有几种方案6=1+1+1+1+1+16=1+1+1+1+26=1+1+2+26=1+1+46=2+2+26=2+47=1+1+1+1+1+1+17=1+1+1+1+1+27=1+1+1+2+27=1+1+1+47=1+2+2+27=1+2+4原创 2014-08-04 20:20:54 · 416 阅读 · 0 评论 -
hdu 3787 A+B
import java.util.*;import java.math.BigInteger;public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner In=new原创 2014-04-27 16:30:19 · 481 阅读 · 0 评论 -
南阳 524 A-B Problem(java中的类BigDecimal)
import java.util.*;import java.math.BigDecimal;public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner In =ne原创 2014-04-27 17:59:00 · 481 阅读 · 0 评论 -
南阳 46 最小乘法次数
#includeint main(){ int n,t,s,i; scanf("%d",&t); while(t--){ scanf("%d",&n); s=0; while(n){ if(n&1) s++; s++; n/=2;原创 2014-04-26 20:06:25 · 510 阅读 · 0 评论 -
poj 3370 Halloween treats
#include#include#define N 100010int main(){ int a[N],b[N],n,m,i,s,begin,end; while(scanf("%d%d",&n,&m)&&n+m) { memset(b,0,sizeof(b)); for(i=1;i<=m;i++) scanf("%d",&a[i]); begin=end=0;原创 2014-01-15 11:27:31 · 468 阅读 · 0 评论 -
南阳 139 我排第几个
康拓展开:把一个整数X展开成如下形式X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,a为整数,并且0全排列:有N个不同的整数,全排列的话有N!个组合 。#include#includeint main(){ int a[12],p[12],n,m,i,j,sum; char s[13]; for(原创 2014-01-15 11:26:33 · 800 阅读 · 0 评论 -
hdu 1576 A/B
#includeint main(){ int n,m,t,i; scanf("%d",&n); while(n--) { scanf("%d%d",&m,&t); for(i=1;;i++) { if((t%9973*i)%9973==m) break;//同余定理 } printf("%d\n",i); } return 0;}总结:(1)gcd原创 2014-01-15 11:11:55 · 486 阅读 · 0 评论 -
南阳 84 阶乘的0
描述计算n!的十进制表示最后有多少个0输入第一行输入一个整数N表示测试数据的组数(1每组测试数据占一行,都只有一个整数M(0输出输出M的阶乘的十进制表示中最后0的个数比如5!=120则最后的0的个数为1样例输入63601001024234568735373样例输出0142425358612183837思原创 2014-01-06 22:34:44 · 608 阅读 · 0 评论 -
南阳 485 A*B Problem
解题思路: 弃九法 #include#includeint main(){ char s1[20],s2[20]; int n,i,sum1,sum2,a,b; scanf("%d",&n); while(n--) { scanf("%s%s",s1,s2); a=strlen(s1);原创 2014-01-06 22:22:46 · 538 阅读 · 0 评论 -
南阳 655 光棍的yy
描述 yy经常遇见一个奇怪的事情,每当他看时间的时候总会看见11:11,这个很纠结啊。现在给你m个1,你可以把2个1组合成一个2,这样就不是光棍了,问这样的组合有多少种??例如(111 可以拆分为 111 12 21 有三种)输入第一行输入一个n表示有n个测试数据以下n行,每行输入m个1(1 输出输出这种组合种数,占一行样例输入311111原创 2014-01-06 22:19:14 · 824 阅读 · 0 评论 -
南阳 86 找球号(一)
看清题!!!#include#include#includeint cmp(const void *a,const void *b){ return *(int *)a-*(int *)b;}int b[100010];int a[1000010];int main(){ int n,m,i,f,r,mod,t; memset(a,0,sizeof(a)); mem原创 2014-01-06 22:39:34 · 623 阅读 · 0 评论 -
南阳 69 数的长度
Stirling公式(斯特林公式)N!=1*2*3*4*5*............*N;如果要计算N!后得到的位数,则我们可以知道其等于lgN!+1lgN!=lg1+lg2+lg3+lg4+lg5+....................+lgN;但是当N很大的时候,我们可以通过数学公式进行优化:(即Stirling公式)N!=sqrt(2*pi*N)*(N/e)^N;(pi原创 2014-01-06 22:33:07 · 579 阅读 · 0 评论 -
南阳 102 次方求模
#includeint main(){ long long n,s,m,i; int test; scanf("%d",&test); while(test--) { scanf("%lld%lld%lld",&n,&m,&i);//对应的数据类型使用对应的输入格式 s=1; while(m)原创 2014-01-03 22:46:56 · 487 阅读 · 0 评论 -
南阳 636 世界末日
#include#include#define N 10010int main(){ int a[N],b[N],n,m,i,s,begin,end; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); memset(b,0,sizeof(b)); s=begin=end=0; for原创 2014-01-15 11:28:57 · 652 阅读 · 0 评论 -
poj 2356 Find a multiple
题目大意:输入一个N,然后输入N个数,从这N个数中找出M个连续的数的和sum是N的倍数。分析: 观察S[i].恰好有个N个S[i],又是N的倍数,联想到抽屉原理!•1)如果{Si}中存在一个数Sk为n的倍数,那么选前k个数即可•2)如果{Si}中不存在n的倍数,那么S1,S2,...Sn除以n所得的n个余数将分布在区间[1,n-1]中,那么必定存在i,j(iimod n原创 2014-01-15 11:30:29 · 639 阅读 · 0 评论 -
南阳 32 组合数
#includeint n,m,num[20];int dfs(int top,int val){ int i; if(val==0){ for(i=m;i>0;i--){ printf("%d",num[i]); } printf("\n"); return 0; } for(i=top;i>0;i--){ num[val]=i; dfs(i-1,v原创 2014-02-25 21:01:57 · 598 阅读 · 0 评论 -
hdu 1753 大明A+B
import java.util.*;import java.math.BigDecimal;public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner In=new原创 2014-04-27 16:47:54 · 404 阅读 · 0 评论 -
南阳 686 An Interesting Sequence
欧拉函数:Phi(n)=n(1-1/p1) (1-1/p2)….. (1-1/pk) 其中p1, p2 ,pk是n的所有素数因子 Phi(n):所有小于等于n的且与n互素的数的个数原创 2014-04-19 11:21:31 · 499 阅读 · 0 评论 -
蓝桥 幸运数
根据埃氏筛法找素数改编的#include#include#includeint num[1000010];int main(){ int n,m,i,j,t,k; long stra,end; while(~scanf("%d%d",&n,&m)){ stra=clock(); for(i=1;i<=m;i++)原创 2014-03-21 17:09:39 · 511 阅读 · 0 评论