提高組基礎班Day1

2021-08-20 15:42:27 字數 3197 閱讀 5597

1、普通的查詢o(nm)

int main() 

return 0;

2、二分查詢

int main() 

const double eps=1e-9;

int sign(double x)

int main()

cout << r;

} }

二、double與long double

都可用cin cout

scanf("%lf",&lf);printf("%lf",lf);

long double ldf;

double lf;

scanf("%lf",&lf);ldf=lf;

printf("%lf",(double)ldf);

三、二進位制運算

(l+r)/2   ==> (l+r) >> 1

l*2 ==> l+l ==> l<<1

l % 2 ==> l - ((l>>1)<<1) ==> l&1

l*2+1 ==> (l<<1) + 1 =>> l<<1|1 ==>> l<<1^1

l* 14 ==> l*(8+4+2) ==> (l<<3)+(l<<2)+(l<<1)

l*16+14 ==> (l<<4)+14 ==> l<<4|14

會快很多。y&1取出y這個數二進位制的最後乙個數

if(y&1)如何此書末位為1,則繼續

y=y>>1把y二進位制數的最後一位去掉

1>>1為0

四、求x的y次方

1、普通

int main() 

2、快速冪!

int mul(int x,int y,int mo) 

return ans;

}

五、矩陣乘法與快速冪結合遞迴

1、for迴圈

第乙個矩陣:m1[n][m];第二個矩陣:m2[m][k];結果矩陣m3[n][k];

for (int a=1;a<=n;a++)

for (int b=1;b<=m;b++)

for (int c=1;c<=k;c++)

m3[a][c] += m1[a][b]*m2[b][c];

第乙個矩陣的寬要等於第二個矩陣的高,輸出矩陣的寬等於第乙個矩陣的寬,高等於第二個矩陣的高

2、過載運算子

struct matrix

}m1,m2,m3;

//matrix operator*(matrix m1,matrix m2)

結構體建構函式,講結構體內數值清零

const 定義函式 &數 傳位址,且保證數在函式中不被改變

這樣之後直接m3=m1*m2即可;

3、矩陣乘法快速冪

mul(m2,n-1);

int mul(matrix x,int y) 

return ans;

}

求斐波那契數列,可以反覆矩陣相乘

1、矩陣乘法結合律(m1*m2)*m3=m1*(m2*m3)

2、矩陣乘法不具有交換律,m1*m2!=m2*m1

數列遞推題都可用矩陣相乘加快速冪解決

例:斐波那契數列p1962

請你求出 f(n) mod 1000000007 的值。

#include#include#define mod 1000000007

using namespace std;

long long n;

bool flag=1;

struct node

}m,mm;

long long a[2][2];

node operator*(const node &m1,const node &m2)}}

return m3;

}node ksm(node x,long long y)

else

}x=x*x;

y=y>>1;

}return ans;

}int main()

node m,mm;

m.z[1][1]=1;

m.z[1][2]=1;

m.z[2][1]=1;

m.z[2][2]=0;

m=ksm(m,n-1);

mm.z[1][1]=1;

mm.z[1][2]=1;

mm=m*mm;

cout《六、搜尋

1、定義乙個無窮大的數

const int inf=0x3f3f3f3f;

memset(dms,0x3f,sizeof(dms));大陣列

2、卡時技巧

#include

t=clock();

if ((clock() - t) * 1000 >= 1900 * clocks_per_sec)輸出答案並退出;

七、技巧

1、#ifdef win32

#define ll "%i64d"

#else

#define ll "%lld"

#endif

針對不同的系統,long long定義不同;

2、scanf("%d",&a);scanf("%d%d",&a,&a2);

cin >> a; cin >> a >> a2;

scanf("%lf",&c);

cin >> c;

printf("%d",a);

cout << a;

printf("%d %d\n",a,a);

cout << a << " " << a << endl;

scanf("%s",d); scanf("%s",d+1);

cin >> d; cin >> d+1;

printf("%s",d); printf("%s",d+1);

cout << d; cout << d+1;

scanf string x;

cin >> s;

3、 字元與數轉化

char gg[100]; //"123"

int z;

sscanf(gg+1,"%d",&z);

sprintf(gg,"%d",z);

Day 1 提高組模擬C組 總結

這次考得著實很差。前期花了大部分時間在第一題,只打出了乙個貪心,後面又去弄第三題竟然沒發現這是合併果子。最後幾分鐘在做第二題,只打出了乙個貪心就沒時間弄了。這次的比賽主要是時間控制和題目理解做的十分不好,或許是我們太久沒有做比賽了,今後還要繼續努力啊!題目時間複雜度 解題報告鏈結 t1 矩陣o n3...

NOIP2011 提高組Day 1題解

總結 第一天的三道題除了第三題 長度有點超過我的接受範圍之外,一二題難度還是比較適中滴,只可惜第二題我打的暴力忘了小小的優化一下,結果沒得全分,有點難過了。這道題的思路就是輸入過後倒著尋找符合條件的地毯,因為越後放的地毯在越上面 這道題我們先列舉第二個客棧的位置,然後去倒推第乙個客棧的位置。當時做這...

NOIP2011提高組DAY1題解

考察知識 模擬,列舉 演算法難度 x 實現難度 x 分析 直接讀入資料然後判斷就可以了,真的沒有難度 includeconst int maxn 10005 int n,a maxn b maxn g maxn k maxn x,y int main printf d n ans return 0 ...