思路:考慮位運算&的特性 只有兩者都為1才會對答案有貢獻 且 對答案貢獻的值為 1 << k 其中k是當前1所在二進位制下的位數 所以考慮預處理每乙個位的1出現的次數 其中對每一位都會遍歷n*n次 所以每一位對答案的貢獻就是 a[i]a[i](1 << i) a[i]為當前位置1的個數
#include
using
namespace std;
#define ll long long
intmain()
;for
(int i =
0;i < n;i ++)}
ll sum =0;
for(
int i =
0;i <=
32;i ++
)printf
("%lld\n"
,sum)
;return0;
}
b.
題意:給出n個點 用這n個點構造三角形 問這些三角形的周長是多少 資料保證合法
思路:我們從邊考慮 組成乙個三角形需要三條邊 且 必須要三條邊 所以每條邊只能被選 n - 2次 所以每條邊對答案的貢獻 就是曼哈頓距離* 出現的次數為n-2次 然後暴力計算和即可 記得開ll
#include
using
namespace std;
#define ll long long
const
int mod =
998244353
;ll a[
3005][
2];int
main()
ll sum =0;
for(
int i =
0;i < n -
1;i ++)}
printf
("%lld\n"
,sum%mod)
;return0;
}
c.
題意:給出長度為n的字串 求有少長度為k的不同子串行
思路:dp肯定是沒跑了 用i, j , k 來表示 前i個字元 長度為j 以字元』a』 + k結尾的子串 dp的值為字串的數量
如果s[i] == 『a』 + k 則構造出新的字串 否則 則從上個狀態轉移過來
#include
using
namespace std;
#define ll long long
const
int mod =
1e9+
7,n =
1e3+5;
ll dp[n]
[n][30]
;///前i個字元 長度為j的 以'a' + k 為結尾的字串
intmain()
for(
int i =
1;i <= n;i ++)}
else}}
} ll res =0;
for(
int i =
0;i <
26;i ++
) res +
= dp[n]
[m][i]
,res %
= mod;
printf
("%lld\n"
,res)
;return0;
}
d.待 牛客練習賽78 補題
b cca的搬運 注意陣列的頭和尾在實際模擬時的情形 include using namespace std const int maxn 1e5 5 int a maxn dp maxn n,m,x1,up maxn ans,sum,vis maxn d,b maxn k,t intmain fo...
牛客練習賽67 補題 題解
a.牛牛愛字串 題意 給定字串,輸出當中的數字,注意不能有前導零。簡單模擬題,但格式要求非常嚴格,最後乙個數字後不能有空格。還有乙個坑點,如果只有0也是要輸出乙個0的。我是用佇列模擬,去掉前導零。include using namespace std const int n 1e5 10 strin...
操作集錦 牛客網 牛客練習賽60
題目傳送 時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 輸入描述 第一行兩個整數n,k 第二行乙個長度為n的字串,保證只存在小寫字母.輸出描述 示例1輸入 3 1 abc輸出 3備註 1 n 1e3 ...