10 2013 档案
摘要:思路:容易得到s[n]=s[n-1]+s[n-2],也就是fib数。求第k小的fib质数的也就是第k个质数数-2,当k>2时。在就是s[n]/x%m=s[n]%(x*m)/x.代码如下:#include#include#include#define ll long long#define M 1000005using namespace std;ll k,x,m;int prime[M],cnt;bool f[20*M];struct mat{ ll m[2][2];};mat mul(mat a,mat b,ll mod){ mat ans; for(int i=0;i>=...
阅读全文
摘要:思路:看题就知道用扩展的欧几里得算法做!!!首先我们可以求出ax+by=gcd(a,b)=g的一个组解(x0,y0).而要使ax+by=c有解,必须有c%g==0.继而可以得到ax+by=c的一个组解x1=c*x0/g , y1=c*y0/g。这样可以得到ax+by=c的通解为: x=x1+b*t; y=y1-a*t;再就是要注意符号问题!!!代码如下: 1 #include 2 #include 3 #define ll long long 4 using namespace std; 5 ll gcd_extend(ll a,ll b,ll &x,ll &y) 6 { 7
阅读全文
摘要:思路:由于只有1-6这几个数,而这几个数的最小公倍数是60,所以只需要求出60以内有多少满足条件的数即可。再就是求出对于给定的n,求出60的倍数。然后就是怎样求的问题了。首先可以写成如下形式: 10n-40=60*n (把最后的40个数去掉,最后在求结果的时候再加上) n=(10n-40)/60. (结果一定可以整除)代码如下: 1 #include 2 #define ll long long 3 #define mod 1000000007 4 ll pw(ll a,ll b) 5 { 6 ll ans=1; 7 while(b){ 8 if(b&1) an...
阅读全文
摘要:思路:由于数据很大,先通过打表找规律可以知道,当n为偶数的时候其SG值为n/2;当n为奇数的时候一直除2,直到为偶数m,则SG值为m/2;代码如下: 1 #include 2 int cal(int m) 3 { 4 while(m&1) m>>=1; 5 return m>>1; 6 } 7 int main() 8 { 9 int t,n,ca=0,a;10 scanf("%d",&t);11 while(t--){12 scanf("%d",&n);13 int ans=0;14 for(int i=
阅读全文
摘要:思路:SG函数枚举先手的每一个位置是否有必胜。1)如果出现了XXX则必胜;2)如果出现了XX或X.X则必败;3)否则计算后手的sg值和。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #define M 201 6 using namespace std; 7 char str[M]; 8 int sg[M],len; 9 vectorp;10 int get_sg(int m) //计算SG值11 {12 if(m<0) return 0;13 if(sg[m]!=-1) return sg[m];14 bool...
阅读全文
摘要:思路:状态DPdp[i]=2*dp[i-1]+dp[i-3]代码如下:求出循环节部分 1 #include 2 #define m 10007 3 int p[m]; 4 int main() 5 { 6 p[0]=p[1]=1;p[2]=2; 7 for(int i=3;i 2 #include 3 #define mod 10007 4 struct mat 5 { 6 int m[3][3]; 7 }e,d; 8 int an[3]={2,1,1}; 9 mat Mul(mat a,mat b)10 {11 mat ans;12 for(int i...
阅读全文
摘要:思路:p[n][m][0]表示A为n,B为m,A为先手胜的概率; p[n][m][1]表示A为n,B为m,B为先手胜的概率。 d[i]表示圆盘上数字的大小。容易得到表达式为:代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #define M 502 8 using namespace std; 9 double p[M][M][2];10 int d[]={5,20,1,18,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12,5,20};11 int cal(in
阅读全文
摘要:思路:看到这个题目就发现所需最短时间也就是房子和相遇点的最远距离具有凹凸性,很容易就想到了三分法枚举。找出所有房子的X坐标的最小最大值作为上下界。代码如下: 1 #include 2 #include 3 #include 4 #define M 50005 5 #include 6 #define inf 200005 7 #define eps 1e-8 8 using namespace std; 9 struct node10 {11 double x,y;12 }p[M];13 int n,cnt;14 double dis(node a,double b)15 {16 ...
阅读全文
摘要:思路:数学题!容易推出结果f[n]=n*f[n-1]+(n-1)!.也即是第一类斯特灵数。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll long long 9 #define M 100000110 #define mod 100000000711 using namespace std;12 ll an[M];13 double p[M];14 void init()15 {16 an[0]=0;an[1]=1;17 p[0]=0;...
阅读全文
摘要:思路:数学题!给定a,b,求s=log2(2a+2b);转化为s=b+log2(2a-b+1),(a>b).测试可以知道,当x>=32时,在精度范围内log2(2x+1)=x。否则将a-b转化为double类型直接计算。代码如下: 1 import java.math.*; 2 import java.math.BigDecimal; 3 import java.util.*; 4 public class Main { 5 public static void main(String arg[]){ 6 BigDecimal a,b,c,x,y,z,d,an,ans;...
阅读全文
摘要:思路:这个分清楚情况就很好做了。注意一点当A的转置等于B的时候(对角线除外),记录A的下三角(或上三角)有cnt个的数与B不同,如果cnt>1则不需要额外的步数就可以了,否则当k==2时结果要加2,反之加1.代码如下: 1 #include 2 #include 3 #define M 105 4 using namespace std; 5 int a[M][M],b[M][M],n; 6 bool is() 7 { 8 for(int i=0;i1) return 0;22 return 1;23 }24 int main()25 {26 int t,ca=0,...
阅读全文
摘要:思路:很容易发现规律,数列和Fib数列一样的。记开始的时候啊a的个数为Y,b的个数为X。建立矩阵。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define M 105 7 #define eps 1e-6 8 #define ll long long 9 #define mod 100000000710 using namespace std;11 struct mat12 {13 ll m[2][2];14 };15 mat Mul(mat a,mat b)16 {17 mat ans;18 ...
阅读全文
摘要:第一题给定一个大数,分解质因数,每个质因子的个数为e1,e2,e3,……em,则结果为((1+2*e1)*(1+2*e2)……(1+2*em)+1)/2.代码如下: 1 #include 2 #include 3 #include 4 #include 5 #define M 10000005 6 #define mod 1000000007 7 #define ll unsigned long long 8 using namespace std; 9 ll prime[M/5],cnt;10 bool f[M];11 void init()12 {13 int i,j;14...
阅读全文
摘要:思路:在没有梯子与蛇的时候很容易想到如下公式:dp[i]=1+(∑dp[i+j])/6但是现在有梯子和蛇也是一样的,初始化p[i]=i;当有梯子或蛇时转移为p[a]=b;这样方程变为:dp[i]=1+(∑dp[p[i+j]])/6再就是注意当i+j>100时,停在原地不变。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define M 105 7 #define eps 1e-6 8 using namespace std; 9 double ans[M],an[M][M];10 int p[M];11 v
阅读全文
摘要:思路:每次找出可能情况最少的位置枚举可能情况!!!poj2676和这题一样不过poj数据比较水,很容易过。代码如下: 1 #include 2 #include 3 #include 4 #define M 100005 5 using namespace std; 6 char str[9][9]; 7 struct point 8 { 9 int x,y;10 }p[82];11 int cnt,tot;12 bool is_ok(int x,int y,char c) //判断c是否可以放13 {14 int u=x/3*3;15 int v=y/3*3;16 ...
阅读全文
摘要:思路:这题的关键就是重复根只可能是整数。这样先求出所有的根的数目,在减去重复的根。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #define ll long long 6 using namespace std; 7 bool f[6000005]; 8 int main(){ 9 ll n,m;10 scanf("%I64d%I64d",&n,&m);11 ll ans=0;12 memset(f,0,sizeof(f));13 for(ll b=1;b=0;c--){17 ...
阅读全文
摘要:思路:当移到右下角时,就不能移动了。所以与右下角的奇偶性相同的位置,都不能直接到达,先手必败!只需考虑与右下角奇偶不同的位置,可以看成NIM博弈。最后NIM和不为0的胜,否者败!!代码如下: 1 #include 2 #include 3 #include 4 #define M 105 5 using namespace std; 6 int main() 7 { 8 int t,ca=0,n,m,a; 9 scanf("%d",&t);10 while(t--){11 scanf("%d%d",&n,&m);12 int an
阅读全文
摘要:思路:(注意2个圆的半径可以不一样)有2种情况:1) 水平和竖直放。这种情况很简单,刚开始以为只有这种情况,但是样例5不对,后来知道还有一种情况。2)斜线也可以放。只要满足勾股数就可以。现在的问题是怎样确定包含2个圆的矩形,可以通过枚举一个圆的半径来确定。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll long long 9 #define M 100010 #define inf 1e1011 #define mod 100000000712 usi
阅读全文
摘要:思路:由于最多只有一个是奇数,所以二分枚举这个点,每次判断这个点的左边区间段所有点的和作为二分的依据。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll long long 9 #define M 20000510 #define inf 1e2011 #define mod 100000000712 using namespace std;13 struct inter14 {15 ll a,b,c;16 }p[M];17 bool cal(in...
阅读全文
摘要:思路:矩阵快速幂+中国剩余定理!!查资料得到2个公式: 1) B[n+p] = B[n] + B[n+1] mod p ; 2) B[p^m+n] = m*B[n] + B[n+1] mod p .用这两个都可以解决这个问题,第二个可以在0ms解决。质因数分解95041567=31*37*41*43*47,用矩阵快速幂分别求出B[n]%p (p是95041567的质因子)的结果。这样就得到5个同余等式,在用中国剩余定理求解既可。代码如下: 1 #include 2 #include 3 #include 4 #define M 51 5 #define mod 95041567 6 #d...
阅读全文
摘要:思路:主要是二进制的运用。为了方便从0开始,首先看下右移一下,高位异或1的规律:(可以从右往左一列一列看)000(0) -> 100(4) -> 110(6) -> 111(7) -> 011(3) -> 001(1) -> 000(0)001(1) -> 000(0) -> 100(4) -> 110(6) -> 111(7) -> 011(3) -> 001(1)010(2) -> 101(5) -> 010(2) -> 101(5) -> 010(2) -> 101(5) -> 0
阅读全文