預估得分: 100
實際得分: 20
最大得分: 100
用時:1小時10分 ~1小時20分函數
一看題目就知道確定是找規律題spa
就是直接暴力求lca,很簡單excel
如下是打的表:code
2
22
142
734
3390
14718
61694
253438
1029118ci
用excel生成一下函數圖像能夠看出,是一個指數函數?
臥槽,昨天剛剛看了這東西,爽,這種東東通常都是x^y的加減形式
開始硬湊
由前三項能夠看出x應該與2有關係,不然很差湊出2來,因此x取2it
2的冪次class
2^0 1
2^1 2
2^2 4
2^3 8
2^4 16
2^5 32
2^6 64
2^7 128im
#include<bits/stdc++.h> #define int long long int using namespace std; const int mod=1e9+7; int n; int ksm(int a,int b) { int res=1; while(b) { if(b&1) res=(res*a)%mod; a=(a*a)%mod; b>>=1; } return res; } signed main() { // freopen("commonants.in","r",stdin); // freopen("commonants.out","w",stdout); cin>>n; if(n<=9) { if(n==1) { cout<<2; return 0; } if(n==2) { cout<<22; return 0; } if(n==3) { cout<<142; return 0; } if(n==4) { cout<<734; return 0; } if(n==5) { cout<<3390; return 0; } if(n==6) { cout<<14718; return 0; } if(n==7) { cout<<61694; return 0; } if(n==8) { cout<<253438; return 0; } if(n==9) { cout<<1029118; return 0; } //n==10 忘記打表了 } int ans=(ksm(2,2*n+2)-(((4*n)%mod+2)*(ksm(2,n)%mod))-2+mod)%mod; while(ans<0) { ans+=mod; } ans=(ans+mod)%mod; cout<<ans%mod;; return 0; }
取模翻車,模出負數來了
應該是統計
(ans%mod+ans)%mod
預估得分:40
實際得分: 40
最大得分: 40
用時: 大約40分鐘
傻逼部分,差點忘了打上這部分的分,哦我真是傻逼
直接暴力統計,暴力計算
複雜度:O(n^4)
感受上每一個點的最大值,和最小值應該和他附近的點有關
感受能夠dp,若是有空再來搞
#include<bits/stdc++.h> //#define int long long int using namespace std; const int N=444; int w[N][N],n,h,p,ans; int ans_max=0,ans_min=2147483647; int d[N][N];//受損程度 #define fre int main() { #ifdef fre freopen("rts.in","r",stdin); freopen("r1.out","w",stdout); #endif cin>>n>>h>>p; if(p==1) { //10pts for(int i=1; i<=n; ++i) for(int j=1; j<=h; ++j) { scanf("%d",&w[i][j]); ans_max=max(w[i][j],ans_max); ans_min=min(w[i][j],ans_min); } cout<<ans_min<<' '<<ans_max; return 0; } //30pts for(int i=1; i<=n; ++i) for(int j=1; j<=h; ++j) scanf("%d",&w[i][j]); for(int i=1; i<=n; ++i) { //枚舉投彈點的橫座標 for(int j=1; j<=h; ++j) { //枚舉投彈點的縱座標 ans=0; for(int k=1; k<=n; ++k) { for(int l=1; l<=h; ++l) { d[k][l]=0; int tmp=abs(i-k)+abs(j-l); d[k][l]=max(0,p-tmp); ans+=d[k][l]*w[k][l]; } } if(ans>ans_max) ans_max=ans; if(ans<ans_min) ans_min=ans; } } cout<<ans_min<<' '<<ans_max; #ifndef fre fclose(stdin); fclose(stdout); #endif return 0; }
預估得分:25
實際得分:25
最大得分: 40
用時:大約1小時多一點
w*h<=2 傻逼部分分,手玩就ok
但是我太菜了。不想手玩,因而就去搞搞其餘部分分
w*h<=8
暴力枚舉每一個棋子放在那個格子裏
臥槽翻車了.....看錯時間
c==1 一共就一顏色的棋子
可見就是要從ai個棋子裏跳出一部分來放到wh的棋盤上,咱們能夠反過來搞
讓wh的棋盤放ai個棋子有多少種方案,臥槽,這不是組合數嘛!!
C{nm,ai}i==1
(⊙o⊙)…組合數怎麼求來着.........一個悲慘的故事開始了....
ai==1 每種顏色的棋子都只有1個
臥槽這不是排列嘛!!!!
(⊙o⊙)…排列怎麼求來着.........又一個悲慘的故事開始了....
等等好像不是,臥槽我不會這一檔
臥槽我不會求排列和組合,部分分搞不到了,那就只能去搞搞正解了
沒有特殊的限制.....應該去看看題目有什麼特殊的性質或者是要求
兩種方案不一樣當且僅當存在一個格子在兩種方案中一種放
棋子一種不放棋子或放的棋子不同
考慮20pts的作法
枚舉每一個棋子的狀況 .仔細觀察數據範圍能夠看出w,h的範圍很是小<=30
因此能夠直接當作狀態來用
用dp[x][i][j]表示x這種棋子放在i,j格子是的合法狀況
算了,不搞了,不會 ,不過sjp大佬確定會!
#include<bits/stdc++.h> #define int long long int using namespace std; const int mod=1e9+7; const int N=2019; int w,h,c; int a[N],flag; int C[N][N],visit[N][N]; int askC(int n,int k) { if(visit[n][k]) return C[n][k]; if(k>n)return 0; if(n==k||k==0) return 1; visit[n][k]=1; return C[n][k]=(askC(n-1,k-1)+askC(n-1,k))%mod; } int pts2() { return askC(w*h,a[1]); } signed main() { freopen("europe.in","r",stdin); freopen("europe.out","w",stdout); cin>>w>>h>>c; for(int i=1; i<=c; ++i) { cin>>a[i]; if(a[i]!=1) flag=1; } if(c==1) {//第2檔分 cout<<pts2()%mod; return 0; } if(w*h<=2) {//第1檔分 if(!a[1]||!a[2]) { cout<<3<<endl; return 0; } else { cout<<0<<endl; return 0; } } if(flag==0) { //第3檔分~~~想錯了咕咕咕。,不是排列 while(1) { break; } cout<<rand()<<15+rand()<<15%mod; return 0; } cout<<rand()<<15+rand()<<15%mod; return 0; }