07 2013 档案
摘要:主要考察表达式的解析和高斯消元!!! 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0) 10 #define SIZE 1024 11 using namespace std; 12 const double eps=1e-8; 13 inline bool zero(double x) 14 { 15 return fabs(x) g[SIZE]; 27 double mat...
阅读全文
摘要:高斯消元法解方程组!!不过这题要取模高斯消元法详解请看这:http://blog.163.com/baobao_zhang@126/blog/static/4825236720099202538409/ 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define ll __int64 10 #define pi acos(-1.0) 11 #define MAX 500 12 using namespace std; 13 int equ,v...
阅读全文
摘要:经典的有限制条件的Burnside计数+矩阵乘法!!!对于这种限制条件的情况我们可以通过矩阵连乘得到,先初始化矩阵array[i][j]为1.如果颜色a和颜色b不能涂在相邻的珠子,那么array[a][b] = array[b][a] = 0; 对于具有n/L个循环节的置换(L为每个循环节的长度)。先求出array[][]的n/L次幂,然后将这个矩阵的array[i][i] (1 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.
阅读全文
摘要:由题知道所求的值0 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 //#define ll __int64 9 #define pi acos(-1.0)10 #define MAX 5000011 using namespace std;12 int main(){13 int n,m,i,sum;14 double l2,c,l,ll,rr,r,mid,s;15 while(cin>>l>>n>>c){16 if (l1e-8){20 m...
阅读全文
摘要:最小值的最大化问题!!!二分搞定……代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0)10 #define MAX 5000011 using namespace std;12 int an[100005];13 int main(){14 int n,m,i,sum,left,right=0,mid,t;15 while(cin>>right>>n>>m)
阅读全文
摘要:给出一组数据,最大值为left,和为right。在[left,right]区间进行二分!!!代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0)10 #define MAX 5000011 using namespace std;12 int an[100005];13 int main(){14 int n,m,i,sum,left,right=0,mid,t;15 while(c...
阅读全文
摘要:首先来看一下Sample里的第一组数据。1 2 2 1 2经过一次变换之后就成了5 5 5 5 4它的原理就是a0 a1 a2 a3 a4->(a4+a0+a1) (a0+a1+a2) (a1+a2+a3) (a2+a3+a4) (a3+a4+a0)如果用矩阵相乘来描述,那就可以表述为1xN和NxN的矩阵相乘,结果仍为1xN矩阵a = 1 2 2 1 2 b = 1 1 0 0 11 1 1 0 00 1 1 1 00 0 1 1 11 0 0 1 1a * b = 5 5 5 5 4所以最终结果就是:a * (b^k)线性代数不合格的同鞋表示压力很大。。对一个NxN矩阵求k次方,而且这
阅读全文
摘要:2个星球周期为a,b。则相差半周的长度为a*b/(2*abs(a-b)),对于n个只需求这n个分数的最小公倍数即可!公式:分数的最小公倍数 = 分子的最小公倍数/分母的最大公约数由于涉及到大数所以用java写的方便! 1 import java.math.*; 2 import java.util.*; 3 4 public class Main { 5 public static void main(String arg[]){ 6 Scanner cin = new Scanner(System.in); 7 int n = cin.nextInt...
阅读全文
摘要:由于k的范围是0-2^31,而且x,y,z都是正整数,由题易知道2#include#include#include#include#include#include#include#define ll __int64#define pi acos(-1.0)#define MAX 50000using namespace std;ll pows(ll a,ll b){ ll ans=1; while(b){ if(b&1) ans*=a; b>>=1; a*=a; } return ans;}int main(){ int...
阅读全文
摘要:置换群就可以搞定!!!注意下格式就好了…… 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define ll __int6410 #define pi acos(-1.0)11 #define MAX 5000012 using namespace std;13 int code[202],an[202];14 char str1[202],str2[202];15 void init(int n)16 {17 int i,j,t;18 for...
阅读全文
摘要:思路:仔细读题,看到FARMER是两两交换牛的顺序进行排序的话,应该就往置换上靠拢,而这个题果然是置换的应用(有的解题报告上说是置换群,其实这只是单个置换,不用让它构成群)。我们来将这些无序的牛抽象成一个置换,一次移动就是对一对元素置换。举个例子: 那么我们用置换环表示应该是(1 6 5)(2 3 4)这样两个3阶环,也就是说这六头牛是两个无序子序列,每个子序列内部按坐标排好序则整体有序,既然要使代价最小,我们就应该让置换的次数尽量少,置换的两个数和尽量小。根据上面的划分,我们知道在一个长度为m的环中至少要移动...
阅读全文
摘要:组合数学!!!详情见:http://hi.baidu.com/lxyzmnwvhokptur/item/18c806469a668fe31e19bc1a#0 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0)10 #define MAX 5000011 using namespace std;12 char a[10];13 int C(int n,int m){14 int sum =1;15 ...
阅读全文
摘要:题解:使用排列组合的知识解决!!!主要求1-n之间的Round Numbers,然后减下就可以了,现在主要就是怎样求n以内的Round Numbers数。分2部分求:1.计算出n的2进制位数为m,这1-(m-1)之间的数可以很快求出,当为偶数2k的时候:C(2k-1,k)+C(2k-1,k+1)+……+C(2k-1,2k-1)=2^(2k-2);当为奇数2k+1的时候:C(2k,k+1)+C(2k,k+2)+……+C(2k,2k)=2^(2k-1)-1/2*C(2k,k);2.再就是求m个2进制位时的Round Numbers数。由于第一个数一定是1所以不变然后继续向低位扫描,并计数0的个数,
阅读全文
摘要:动态规划!!! 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0)10 #define MAX 5000011 using namespace std;12 ll dp[202][202];13 int score[5][5]={14 5,-1,-2,-1,-3,15 -1,5,-3,-2,-4,16 -2,-3,5,-2,-2,17 -1,-2,-2,5,-1,18 ...
阅读全文
摘要:数据不是很大,直接枚举约数,判断4个条件是否满足!这样就得到4种卡片,总共2^4种情况,枚举各种情况即可!!! 1 #include 2 #include 3 #include 4 #define MAX 5000005 5 #define ll long long 6 using namespace std; 7 bool ispri[MAX]; 8 int extra[4]; 9 struct card 10 { 11 int score,num,s; 12 }p[1002]; 13 bool cmp(const card &aa,const card &bb){...
阅读全文
摘要:先算出lcm(a,b),如果lcm>=n,则直接暴力解决;否则分段,求出0-lcm内的+0-n%lcm内的值。再就是连续相同的一起计算!! 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define ll __int6410 using namespace std;11 ll gcd(ll a,ll b){12 ll t;13 if(an) temp=n-i; //如果i+temp>n 则后面最多只有n-i个数了31 ans +...
阅读全文
摘要:解题报告:记录 A_i 为长度为 i 的树枝的数量,并让 A 对它本身做 FFT,得到任意选两个树枝能得到的各个和的数量。枚举第三边,计算出所有两边之和大于第三条边的方案数,并把前两条边包含最长边的情况减掉就是答案。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0) 10 using namespace std; 11 const int MAX = 400002; 12 //复数结构...
阅读全文
摘要:此处介绍另一种方法来解决这题,也就是FFT(快速傅里叶变换)如果是乘法,位数为n和位数为m的相乘,需要n*m次的乘法运算。FFT在数字信号处理学过,但是第一次用来做这类题目,神奇啊。乘法其实就是做线性卷积。用DFT得方法可以求循环卷积,但是当循环卷积长度L≥N+M-1,就可以做线性卷积了。使用FFT将两个数列转换成傅里叶域,在这的乘积就是时域的卷积。给几个学习的链接吧:http://wenku.baidu.com/view/8bfb0bd476a20029bd642d85.html (这主要看那个FFT的流程图)http://wlsyzx.yzu.edu.cn/kcwz/szxhcl/kech
阅读全文
摘要:指数型母函数应用!!!import java.math.*; import java.util.*;public class Main { public static int []a; public static void main(String arg[]){ BigInteger [] p =new BigInteger[313]; p[1]=BigInteger.ONE; int i; for(i=2;i<=312;i++){ p[i] = p[i-1].multiply(BigInteger.valueOf(i)); } Scanner cin = new Scanner...
阅读全文
摘要:指数型母函数的应用求A B C D 在规定条件下n个元素的排列个数,先写出指数型母函数 G(X) = ( 1 + x + x^2/2! + x^3/3! +... )^2 * ( 1+ x^2/2! + x^4/! + .. )^2 前者表示:B, D出现方式不限制;后者表示:A, C 只能出现偶数或者不出现情况 又知: e^x=1+x/1!+x^2/2!+x^3/3!+... e^(-x)=1-x/1!+x^2/2!-x^3/3!+... 化简得: G(x) = e^(2x) * ((e^x+e^(-x))/2)^2 = (1/4) * e^(2x) * (e^(2x) + 2 + e^(.
阅读全文
摘要:简单的指数型母函数!!!#include#include#include#include#include#include#include#includeusing namespace std;double a[1001],b[1001],p[1002],s[110];void init(){ s[0]=s[1]=1; for (int i=2; i>p[i]; } memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(i=0;i<=p[1];i++) a[i]=1.0/s[i]; for(i=2;i<=n;i++){ for(j=
阅读全文
摘要:母函数的特殊情况,左右两边都可以放,如样例1,2,9母函数为(1+x+1/x)*(1+x^2+1/x^2)*(1+x^9+1/x^9)化简为(1+x+x^2)*(1+x^2+x^4)*(1+x^9+x^18)/(x*x^2*x^9)这样就好计算了,看代码:#include#include#include#include#include#include#include#includeusing namespace std;__int64 a[30001],b[30001],an[10001];int main(){ int i,j,k,n,sum,num; while (cin>>n
阅读全文
摘要:最近学习容斥原理,实现容斥原理大致有三种方法:dfs,队列数组,二进制。今天主要讲下二进制实现容斥原理: 有一个集合{A1……An},求集合的子集?很显然答案为也就是2^n个,也就是每一个子集有唯一标志符 i (0 2 #include 3 #include 4 #include 5 #includ...
阅读全文
摘要:水题,注意不要去掉前导0……#include#include#include#include#include#include#include#define ll __int64#define pi acos(-1.0)using namespace std;char an[100005];int m;int fun(){ int sum=0,i; for(i=0;i9) { t=(an[i]-'0')/10; an[i]=(an[i]-'0')%10+'0'; } else t=0; } if(t!=0) an[m++]=t+'0'
阅读全文
摘要:这题主要是推公式……#include#include#include#include#include#include#include#define ll __int64#define pi acos(-1.0)using namespace std;ll mod=1000000007;ll pows(ll a,ll b){ ll ans=1; while(b) { if(b&1) ans=(ans*a)%mod; b>>=1; a=(a*a)%mod; } return ans;}int main(){ int t; ll ans,n,k,m; cin>>t;
阅读全文
摘要:#include#include#include#include#include#include#include#include#define ll __int64#define pi acos(-1.0)using namespace std;int gcd(int a,int b){ int t; if(a>t; while(t--) { cin>>an; len=an.length(); pos2=an.find('(',0); pos3=an.find(')',pos2); if(pos2<0) { a=0; for(i=2;i&
阅读全文
摘要:这题枚举k节省时间#include#include#include#include#include#include#include#include#define ll __int64#define pi acos(-1.0)using namespace std;int an[9],n,m,x,k,dp[102][102];bool vis[9];void dfs(int d,int num){ int i,temp; if(d==n) { for(i=1;inum) dp[i][temp]=num; return ; } for(i=0;i<n;i++) { if(vis[i]==0)
阅读全文
摘要:容斥原理!!这题首先要去掉=0和>=n的值,然后再使用容斥原理解决我用的是数组做的…… 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 using namespace std;10 int an[11],n,m,num,a[11];11 ll gcd(int a,int b)12 {13 int t;14 if(a>n>>m)50 {51 num=0;k=0;52 for(i=0;i>t;...
阅读全文
摘要:因子和:6的因子是1,2,3,6; 6的因子和是 s(6)=1+2+3+6=12;20的因子是1,2,4,5,10,20; 20的因子和是 s(20)=1+2+4+5+10+20=42;2的因子是1,2; 2的因子和是 s(2)=1+2=3;3的因子是1,3; 3的因子和是 s(3)=1+3=4;4的因子和是 s(4)=1+2+4=7;5的因子和是 s(5)=1+5=6;s(6)=s(2)*s(3)=3*4=12;s(20)=s(4)*s(5)=7*6=42;这是巧合吗?再看 s(50)= 1+2+5+10+25+50=93=3*31=s(2)*s(25),s(25)=1+5+25=31.这在
阅读全文
摘要:公式:a^b%p=a^(b%phi(p)+phi(p))%p b>=phi(p) 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 using namespace std;10 ll euler(int n)11 {12 ll ans=1;13 for(int i=2;i*i1) ans*=n-1;27 return ans;28 }29 ll pows(ll a,ll b,ll m)30 {31 ll ans=1...
阅读全文
摘要:此题用到的公式:a^b%c=a^(b%phi(c)+phi(c))%c (b>=phi(c)).1.当n!=phi(p) && n!%phi(p)!=0,用上面公式求;3.当n!>=phi(p) && n!%phi(p)==0,变为n^(phi(p))%p,找循环节,就可以了 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define ll unsigned __int6410 using namespace std
阅读全文
摘要:这题主要是质因数分解!!求出每个因子的幂,如果有负数,则输出-1;如果2的幂数为0,这输出0;最后就是开始凑阶乘了…… 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 using namespace std; 10 int prime[1300],cnt,p[1300],q[1300],num[1300],len; 11 int s[1300],r[1300],a[1300]; 12 bool f[10010]; 13 int min(int a...
阅读全文
摘要:这题的主要就是找循环节数,这里用找字符串最小覆盖来实现,也就是n-next[n],证明在这http://blog.csdn.net/fjsd155/article/details/6866991#include#include#include#include#include#include#includeusing namespace std;__int64 mod=100000007;int dis[360005],data[360005],next[360005];__int64 euler(__int64 n){ int i; __int64 ans=1; for(i=...
阅读全文
摘要:首先,记50的为0,100的为1.当m=4,n=3时,其中的非法序列有0110010;从不合法的1后面开始,0->1,1->0,得到序列式0111101也就是说,非法序列变为了n-1个0,m+1个1.总的数目=C(m+n,n),非法的=C(m+n,m+1)符合数目=(C(m+n,n)-C(m+n,m+1))*m!*n!;化简得:(m+n)!*(m+1-n)/(m+1).Java代码: 1 import java.io.*; 2 import java.math.*; 3 import java.math.BigInteger; 4 import java.lang.String.*
阅读全文
摘要:求实数的幂,这个用C++写的话有点长,但是用Java写就非常方便了……import java.io.*;import java.math.*;import java.util.*;import java.text.*;public class Main{ public static void main(String arg[]){ Scanner cin=new Scanner(System.in); String an; while(cin.hasNextDouble()) { BigDecimal ans = cin.nextBigDecimal(); int n=cin.nextInt(
阅读全文
摘要:这题分2种情况:1) n>=m时,k!%m=0(k>=m),所以只需令n=m-1即可;2) n#include#include#include#include#include#includeusing namespace std;int main(){ int n,i,j,k,t,m; char a[100]; cin>>t; while(t--) { cin>>a>>m; i=strlen(a); if(i>7) n=m-1; else { sscanf(a,"%d",&n); if(n>=m) n=m-
阅读全文
摘要:好题!!!没话说……用到的知识面很多,这题的难点在于公式的推导。原始推导过程见:http://hi.baidu.com/spellbreaker/item/d8bb3bda5af30be6795daa93这个过程有点小问题,改进后的见:http://blog.csdn.net/acm_cxlove/article/details/7868589下面是自己敲的代码: 1 /************************************************************************* 2 > File Name: xh.cpp 3 > Au...
阅读全文
摘要:总的来说,这题要2次用到polya定理。由题目条件A*A=B*B+1,变形为(A-1)*(A+1)=K*B*B;分别分解A-1和A+1的质因数,在合并在一起。第一步:搜索B,对B*B的正方形涂色,基本的polya定理搞定,即C^(B*B)+C^((B*B+1)/2)+2*C^((B*B+3)/4).第二步:搜索K,在A-1和A+1的因子中搜索,这样不会超时,在用polya定理,最后在结果上乘C就可以了…… 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using na...
阅读全文
摘要:高精度+polya原理可以搞定思路:设边长为n的正方形,c种颜色。旋转只有 0,90,180,270度三种旋法。旋0度,则置换的轮换数为n*n旋90度,n为偶数时,则置换的轮换数为n*n/4,n为奇数,则置换的轮换数为(n*n-1)/4+1旋180度,n为偶数时,则置换的轮换数为n*n/2,n为奇数,则置换的轮换数为(n*n-1)/2+1旋270度,n为偶数时,则置换的轮换数为n*n/4,n为奇数,则置换的轮换数为(n*n-1)/4+1反射 沿对角反射两种,沿对边中点连线反射两种n为偶数时,沿对边中点连线反射两种的置换轮换数为 n*n/2 沿对角反射两种的置换轮换数为 (n*n-n)/2+nn
阅读全文
摘要:完全是套用polya模版……#include#include#include#include#include#includeusing namespace std;int prime[30005],m,mod=1000000007;bool f[30005];__int64 extend(__int64 a,__int64 b,__int64 &x,__int64 &y){ __int64 d; if(b==0) { x=1;y=0; return a; } else { d=extend(b,a%b,x,y); __int64 t=x; x=y; y=t-a/b*y; } r
阅读全文
摘要:计算几何,主要是排序问题,其他都很好做……#include#include#include#include#include#includeusing namespace std;struct seg{ double k,b; double x1,y1; double x2,y2; bool flag;}an[10002];int same(double a,double b){ if(fabs(a-b)>1e-8) return 0; return 1;}bool less(double a,double b){ if(a-b>1e-8) return 0; return 1;}b
阅读全文
摘要:这题当时竟然没看啊……找规律:求和m+m+m-1+m-1+……前n项#include#include#include#include#include#includeusing namespace std;int main(){ __int64 n,m,i,sum; while(scanf("%I64d%I64d",&m,&n)!=EOF) { sum=0; for(i=0;i<n/2;i++) { sum+=m-i; } sum=2*sum+m-n/2; printf("%I64d\n",sum); } return 0;}
阅读全文
摘要:……但是没仔细看,直接跳过了这题直接枚举就可以过了#include#include#include#include#include#includeusing namespace std;__int64 a[5];int n;__int64 swap(__int64 x){ if(n==1) return a[1]*x+a[0]; else if(n==2) return a[2]*x*x+a[1]*x+a[0]; else if(n==3) return a[3]*x*x*x+a[2]*x*x+a[1]*x+a[0]; else return a[4]*x*x*x*x+a[3]*x*x*x+a
阅读全文
摘要:这题在比赛的时候不知道怎么做,后来看了别人的解题报告,才知道公式sn=(a+sqrt(b))^n+(a-sqrt(b))^n;具体推导 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 struct ma 9 {10 __int64 a[2][2];11 void init()12 {13 a[0][0]=a[1][1]=1;14 a[0][1]=a[1][0]=0;15 }16 };17 int m...
阅读全文
摘要:求分数的最小公倍数。对于a/b c/d 先化简为最简分数,分数最小公倍数=分子的最小公倍数/分母的最大公约数。#include#include#include#include#include#includeusing namespace std;__int64 gcd(__int64 a,__int64 b){ __int64 t; if(a>t; while(t--) { scanf("%d/%d %d/%d",&a,&b,&c,&d); g=gcd(a,c); x=a/g*c; b*=c/g; d*=a/g; y=gcd(b,d);
阅读全文
摘要:刚开始做这题时,用的是0.75[8]=(7/8+5/64)[10]这个,但是总是WA…………无语了……后来看别人的解题报告,知道了另外一个就是0.75[8]=((5/8+7)/8)[10],从低位向高位计算#include#include#include#include#include#includeusing namespace std;char a[101],b[101],c[101];int main(){ long i,j,len,lenb,lenc,k,l,add,temp; while(cin>>a) { len=strlen(a); lenc=0; for(i=len
阅读全文
摘要:找规律的题目an=an-1+(i+i%2)/2*2;#include#include#include#include#include#includeusing namespace std;int main(){ int i,j,ans[51]; ans[1]=1; for(i=2;i>t; while(t--) { cin>>n; cout<<ans[n]<<endl; } return 0;}
阅读全文
摘要:纯粹的阅读理解题…………#include#include#include#include#include#includeusing namespace std;int main(){ int n,i,j,t,k,m[101],l; double cost,sum,car,p[101],s; while(cin>>t>>cost>>sum>>k) { if(t>l>>s; if(i==0) p[j++]=s; else { while(j=sum) { cout=sum) break; } if(i==1) cout<<
阅读全文
摘要:刚开始没看清题意,要找的数一定要是素数#include#include#include#include#include#includeusing namespace std;int fun(int n){ int ans=0; while(n) { ans+=n%10; n/=10; } return ans;}int main(){ int n,i,j,k,sum,m; while(scanf("%d",&n)&&n) { for(k=n+1;;k++) { n=k;sum=0;m=0; for(i=2;i1) sum+=fun(n); if(su
阅读全文
摘要:这个要慢慢理解……#include#include#include#include#include#includeusing namespace std;int main(){ int n,i,j,k,a1,a5,a10; bool flag; while(cin>>n>>a1>>a5>>a10&&(n+a1+a5+a10)) { i=j=k=0; if(n%5>a1) { cout0) j--; else { if(i>=5) i-=5; else { cout<<"Hat cannot buy
阅读全文
摘要:简单水题……#include#include#include#include#include#includeusing namespace std;int main(){ int n,i,j; while(cin>>n) { j=0; for(i=0;i<=n/3;i++) { j+=(n-3*i)/2+1; } cout<<j<<endl; } return 0;}
阅读全文
摘要:思路:这里有2种情况:一种是相遇:满足关系是 (va+vb)*t=L*(2*n-1)一种是追及: 满足关系是 |va-vb|*t=L*(2*n-1)这样求出2种情况的时间,在排序就可以了……链接:http://acm.hdu.edu.cn/showproblem.php?pid=1275#include#include#include#include#include#includeusing namespace std;double ans[2001];int main(){ int n,num,m,ia,ib,i,j; double len,va,vb,dis; cin>>m;
阅读全文
摘要:思路:一定有sum[1]=num[1]+num[2],sum[2]=num[1]+num[3];但是sum[3]不知道是由num[1]+num[4]还是num[2]+num[3],这就需要枚举一下了。然后算出num[1],num[2],num[3]的值。并从sum中剔除他们,这是最小的一个一定是num[1]+num[4],再把num[4]+num[2-(4-1)]的和剔除,这时最小的一定是num[1]+num[5]……以此类推就可以了……链接:http://acm.hdu.edu.cn/showproblem.php?pid=1270#include#include#include#inclu
阅读全文
摘要:看了别人的解题报告a了,大致思路就是A=a+b*10^k+c*10^(k+1) B=a+c*10^k (在A中取出一位数后)N=A+B=2*a+b*10^k+11*c*10^k这样就好做了,再就是注意进位可能影响b的值……链接http://acm.hdu.edu.cn/showproblem.php?pid=1271#include#include#include#include#include#includeusing namespace std;int main(){ int n,i,j,a,b,ans[1000],m,c; while(cin>>n&&n) {
阅读全文
摘要:由乘2取整得到分数的小数位,可以找到规律!!!例如:1/10,2/10,4/10,8/10,16/10,32/10,64/10……取整后:1/10,2/10,4/10,8/10,6/10,2/10,4/10……这样我们就发现规律了!!!也就是对于p/q而言,要满足2^x=2^y mod q (gcd(p,q)==1);化简:2^x*(2^(x-y)-1) = 0 mod q;q里面2的倍数有多少个,就是最小的循环起始位置。继而化简:2^(x-y) = 1 mod q' (q'除以2的倍数之后的值)也就是求2^t = 1 mod q'由欧拉定理知道:t=phi(q'
阅读全文
摘要:质因数分解;牛人推导公式(1^3+2^3+……+(1+a1)^3)*……*(1^3+2^3+……+(1+ai)^3)……链接http://poj.org/problem?id=3604 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 int prime[3001],m; 9 bool f[3001];10 void init()11 {12 int i,j;13 m=0;14 memset(f,0,sizeof(f));15 fo...
阅读全文
摘要:数论水题,利用筛选法…… 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 int an[1000001];10 int main()11 {12 int i,j,k,n;13 memset(an,0,sizeof(an));14 for(i=5;i1000000)19 break;20 if(an[j]==0&&an[i]==0)21 ...
阅读全文
摘要:高精度+大数同余求模,采用千进制能够AC……链接http://poj.org/problem?id=2635 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 char a[10000];10 int b[10000],prime[1000101],m;11 bool f[1000105];12 void init()13 {14 __int64 i,j;15 m=0;16 memset(f,0,sizeof(f));...
阅读全文
摘要:扩展的欧几里得算法……链接http://poj.org/problem?id=2115 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 __int64 extend_gcd(__int64 a,__int64 b,__int64 &x,__int64 &y)10 {11 __int64 d;12 if(b==0)13 {14 x=1;15 y=0;16 return a...
阅读全文
摘要:将a^b进行素数分解为a1^p1*a2^p2*……ai^pi;则因子之和为:(1+a1+a1^2+……+a1^p1)*(1+a2+a2^2+……+a2^p2)……(1+ai+ai^2+……+ai^pi)这样就方便多了,使用二分快速幂可以快速求出结果……链接http://poj.org/problem?id=1845#include#include#include#include#include#include#includeusing namespace std;int prime[10001],k,f[10001],e[10001];bool a[10001];const int M=990
阅读全文
摘要:这个有2种方法。一种是通过枚举p的值(p的范围是从1-32),这样不会超时,再就是注意下精度用1e-8就可以了,还有要注意负数的处理…… 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 int fun(double n) 9 {10 int p=32,f=1;11 if(n=1;p-=f)18 {19 double a=pow(n,1.0/p);20 long t1=a;21 long t2...
阅读全文
摘要:不互质的中国剩余定理……链接http://acm.hdu.edu.cn/showproblem.php?pid=3579#include#include#include#include#includeusing namespace std;int n,m;int extend_gcd(int a,int b,int &x,int &y){ int m; if(b==0) { x=1; y=0; return a; } else { m=extend_gcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; } return m;}int main(){
阅读全文
摘要:主要考察卡特兰数,大数乘法,除法……链接http://acm.hdu.edu.cn/showproblem.php?pid=1134#include#include#include#include#includeusing namespace std;int an[102][102];void mul(int i){ int k,j,t=0,a=4*i-2,b=i+1,temp; k=100; while(an[i-1][k]9) k--; for(j=0;j9) { t=an[i][j]/10; an[i][j]%=10; } else t=0; } while(t!=0) { an[i][
阅读全文
摘要:中国剩余定理……、链接http://acm.hdu.edu.cn/showproblem.php?pid=1370 1 /************************************************************************* 2 > File Name: xh.cpp 3 > Author: XINHUA 4 > Mail: 525799145@qq.com 5 > Created Time: 2013/7/11 星期四 17:46:00 新华 6 *********************************...
阅读全文

浙公网安备 33010602011771号