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 ...