吉老師的題,出的很有水平(應該是t1,t2難度)給出 \(l1, l2, r1, r2, m\) 詢問 \(\displaystyle \sum_^ \sum_^ [m | i \oplus j]\)
對於前 \(30\) 分,我們可以簡單列舉
對於第二個點,我們已知乙個數
顯然對於 \(10 ^ \) 的資料範圍,我們只能考慮 \(o(1)\) 或者 \(o(logn)\) 的演算法
由於如果需要列舉 \([l, r]\) 中的數,時間複雜度將會乘上 \(o(n)\),我們需要考慮直接進行計算
因為確定了 \(x\) ,不同 \(y\) 的值與 \(x\) 異或的值一定不一樣,並且一定是緊密排布的
因此我們可以直接計算出這些數的開頭以及結尾,還有 \(m\) 的倍數的個數
對於所有資料
我們考慮將這個問題轉換為字首問題
記 \(f(x, y)\) 為 \(\displaystyle \sum_^ \sum_^ [m | i \oplus j]\)
那麼我們可以將原問題轉換為 \(f(r1, r2) - f(l1, r2) - f(r1, l2) + f(l1, l2)\)
\(f(x, y)\) 可以通過二進位制分解後選取一部分做上一種情況來求解
每條邊至少走一次,從 \(1\) 出發回到 \(1\)#include #include using namespace std;
#define qword long long
qword l1, l2, r1, r2, p, ans = 0;
#define m 998244353ll
qword solve(qword l, qword r, qword p)
qword solve(qword a, qword b)
return res;
}int main()
} else ans = solve(++r1, ++r2) - solve(l1, r2) - solve(r1, l2) + solve(l1, l2);
cout << (ans + m) % m << endl;
}
應為這是乙個閉合迴路,如果我們將重複走的邊進行拆分,那這張圖就是個尤拉迴路
因此,我們要保證每個點的度都是偶數
考慮新增哪些邊使得每個點的度是偶數
由於每加一條邊,只會改變兩個點的度,並且這個度是可以傳遞的 最短路 + dp? 時間暴了發現由於邊權全部是 \(2\) 的冪次,並且冪次高的一定比所有冪次小的的和大,所以我們只要選取了高冪次的,我們就可以通過選取低冪次來降低總的 \(ans\)
由此,我們可以發現我們最終選取的值全部都在這個圖的mst上
那麼原問題將轉變成選取那些邊,可以使得這棵樹上所有的點的權值全是偶數
簡單dfs即可
注意取模
如題所述#include #include using namespace std;
#define qword long long
const int maxn = 5e5 + 10;
int n, m, u[maxn], v[maxn], w[maxn], fa[maxn], d[maxn], ver[maxn << 1], head[maxn << 1], next[maxn << 1];
long long mi[maxn], tot = 0, ans = 0, edge[maxn << 1];
bool vis[maxn];
#define ch ch = getchar()
const int q = 998244353;
template inline void read(t &x)
int find(int x)
inline void addedge(int x, int y, int z)
int dfs(int x)
if (d[x] & 1) return 1;
else return 0;
}int main()
for (int i = 1; i <= m; ++ i)
dfs(1);
cout << ans << endl;
}
\(t\) 是從 \(s\) 中刪除一些字元得到的,\(t\) 一共有 \(\binom\) 種
考慮逆過程,我們在 \(t\) 上面插入 \(a-c\) 個 \(0\),\(b-d\) 個 \(1\) 來得到 \(s\)
但是直接插入會計算重複,比如 \(t\) 是 \(000\),插入乙個 \(0\) 有 \(4\) 種位置,但是得 到的都是相同的結果
為了避免計算重複,我們限制所有統計的插入方案,必須對應著 \(t\) 在 \(s\) 中最 靠前的一次出現,比如在上面的例子中,我們只統計 \(0\) 插入到最末尾的情況。
顯然在這樣的要求下, \(0\) 只能插入到 \(1\) 前面或者末尾,\(1\) 只能插入到 \(0\) 前面或者末尾。因此在一共 \(c+d+1\) 個間隔中,除了末尾以外,其他間隔都只能插入一種數字
可以列舉末尾有幾個 \(0\) 幾個 \(1\),然後用插板法統計方案
#include #define qword long long
const int p = 1e9 + 7;
const int maxn = 2010;
int ans, c[maxn << 1][maxn], a, b, c, d;
int main()
if(!c || !d)
for (int i = 0; i <= a - c; ++ i)
for (int j = 0; j <= b - d; ++ j)
printf("%d", ans);
}
牛客網練習30
眾所周知,小k是nowcoder的 苟管理,所以小k很擅長踢樹,雖然本題與踢樹無關 小k喜歡將日期排列成yyyy mm dd的形式 位數不足添零補齊 的形式,雖然這與小k只會做回文字串這道水題無關,但小k覺得日期組成的回文串也是挺可愛的。作為乙個涼心出題人,小k決定給你乙個可愛的問題 給你兩個日期,...
牛客網程式設計 五
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。publicboolean duplicate int number...
牛客網專項練習(七)
1 以下哪個資料結構不是多型資料型別 正確答案 d 棧廣義表有向圖字串分析 多型就是資料元素的型別不確定,字串的每個元素始終都是字元 char 而不會是別的型別。比如棧可以是整數棧 字元棧 物件棧等等。但是字串,它的元素必然是字元。2 以下資料結構中,是非線性資料結構 正確答案 a 你的答案 a 正...