杭電第六場補題(待完善)

2021-10-23 10:41:47 字數 3441 閱讀 1893

題目理解:輸入乙個等式,判斷在(2~16)進製之內是否成立,成立則輸出對應進製(多個滿足輸出最小),不成立輸出-1。

參考隊內的ac**,在自己的理解下稍微改動,整體思路是參考的。

具體解釋見**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define n 6000005

#define m 100

#define ll long long

#define mod 998244353

using

namespace std;

string num1,num2,num3;

string num[3]

;bool flag;

inttrans

(string a,

int n)

return sum;

}void

solve

(char op)

st=max(st,max_num+1)

;//通過上述操作可以使st從最大可能的進製開始,而不是從2開始,這樣可以使時間複雜度減少

for(

int i = st; i <= end; i++

)break;}

case

'-':

break;}

case

'*':

break;}

case

'/':

break;}

}}printf (

"-1");

return;}

intmain()

}solve

(op)

;puts(""

);}}

對於我來說,我認為最難想到的是

int max_num=0;

for(

int i=

0;ilength()

;i++

) st=

max(st,max_num+1)

;//通過上述操作可以使st從最大可能的進製開始,而不是從2開始,這樣可以使時間複雜度減少

如果是我可能直接從2開始查詢。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define m 100

#define ll long long

using

namespace std;

intmain()

return0;

}

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define m 100

#define ll long long

using

namespace std;

const

int n=

200005

;const

int mod=

1e9+7;

ll a[n]

,s[n]

;ll quick

(ll a, ll b)

return ans % mod;

}long

long

inv(

long

long a)

intmain()

ll k=

0,ans=0;

for(

int i=

1;i<=n/

2;i++)if

(n%2!=0

) ans=

(ans*

inv(

(ll)n*

(n+1)/

2%mod)

)%mod;

//n*(n+1)/2是參與分子計算的總個數,注意前面要加(ll)(從隊友那學來的,開始沒加就wa了)

printf

("%lld\n"

,ans);}

}

dp[i][j][val]:[i,j]區間內是否能計算出valval。

於是可得轉移方程:

dp[i][j][v1+v2]=dp[i][mid][v1]+dp[mid+1][j][v2]

dp[i][j][v1∗v2]=dp[i][mid][v1]*dp[mid+1][j][v2]

上述轉移方程參考部落格:參考

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define max 0x3f3f3f

#define ll long long

using

namespace std;

const

int n=

5050

;int re[n]

;string s=

" 1145141919114514191911451419191145141919"

;set<

int> dp[20]

[20];

void

dfs(

int l,

int r)

if(num<=

5000

) dp[l]

[r].

insert

(num);}

for(

int i=l;i

}}intmain()

} re[3]

=re[7]

=-1;

//根據題解只有當n=3和n=7時輸出-1

int t;

scanf

("%d"

,&t)

;while

(t--

)}

杭電多校第六場(IF)

題意 有命題 將 b 進製數y按位相加,迴圈無窮次,最終結果若 x 0,則有y x 0,反之不然 給出b和x,判斷命題是否成立 打表發現的b x 1時成立,看到有數論大佬推出來的 想看推導的右轉 includeusing namespace std typedef unsigned long lon...

20190807杭電多校第六場

賽中和隊友一直在搞乙個胡搞做法,艱難優化到本地跑10s,可惜始終過不了。最後只好補了題解做法。倒著刪除,用樹狀陣列求lis,維護一條當前的lis的路徑。若被刪除的數不在當前的lis中,則答案不變 否則,重新做一遍lis。據說因為lis的期望長度為sqrt n 所以被選中的概率是 ac include...

2019 杭電多校(第六場)

1005 snowy smile 線段樹 題意給你n個點 讓你畫個矩形 使矩形內所含點的權值和最大 必須有點 思路離散化 列舉矩形的左右區間 線段樹維護y座標的最大欄位和 複雜度 o n n lgn include using namespace std typedef long long ll c...