2019 10 16 解題報告

2022-04-10 04:41:16 字數 3972 閱讀 1554

【題目描述】

對於給定的乙個正整數\(n\), 判斷n是否能分成若干個正整數之和 (可以重複) ,其中每個正整數都能表示成兩個質數乘積。

【輸入描述】

第一行乙個正整數 \(q\),表示詢問組數。

接下來 \(q\) 行,每行乙個正整數 \(n\),表示詢問。

【輸出描述】

\(q\) 行,每行乙個正整數,為$ 0$ 或 \(1\)。\(0\) 表示不能,\(1\) 表示能。

【輸入樣例】

\(5\)

\(1\)

\(4\)

\(5\)

\(21\)

\(25\)

【輸出樣例】

\(0\)

\(1\)

\(0\)

\(1\)

\(1\)

【樣例解釋】

\(4=2*2\)

\(21=6+15=2*3+3*5\)

\(25=6+9+10=2*3+3*3+2*5\)

\(25=4+4+4+4+9=2*2+2*2+2*2+2*2+3*3\)

【資料範圍】

\(30\%\)的資料滿足:\(q\leq 20,n\leq 20\)

\(60\%\)的資料滿足:\(q\leq 10000,n\leq 5000\)

\(100\%\)的資料滿足:\(q\leq 10^5,n\leq 10^\)

solution

當\(n \leq 20\) 時,只有\(1,2,3,5,7,11\)無解,其餘均有解。

當\(n > 20\) 時,因為\(n = (n-4) + 4 = (n-4) + 2 * 2\),而\((n-4)\)這個數\(\geq 16\),是一定有解的。

所以,我們證明了對於任意的正整數\(n\),

只有\(n = 1,2,3,5,7,11\)時無解,其餘均有解。

那麼我們只需要在每組資料中判斷一下n是否等於\(1,2,3,5,7,11\)中的任意乙個即可。

複雜度\(o(q)\).

code

//****定理 

#include #include using namespace std;

int q;

long long x;

long long read()

while(isdigit(ch))

return s * w;

}int pd(int x)

int main()

fclose(stdin);

fclose(stdout);

return 0;

}

【題目描述】

有乙個長度為\(n\)的自然數序列\(a\),要求將這個序列恰好分成至少\(m\) 個連續子段。 每個子段的價值為該子段的所有數的按位異或。要使所有子段的價值按位與的結果最大,輸出這個最大值。

【輸入描述】

第一行乙個正整數 \(q\),表示詢問組數。

接下來$ q$ 組輸入,每組輸入兩行:

第一行兩個正整數 \(n,m\)。

第二行 $n $個正整數,描述序列 \(a\)。

【輸出描述】

一行乙個正整數,表示答案。

【輸入樣例】

\(1\)

\(5\)

\(3\)

\(1\)

\(2\)

\(3\)

\(4\)

\(5\)

【輸出樣例】

\(1\)

【資料範圍】

\(20\%\)的資料:\(n\leq 20\)

\(40\%\)的資料:\(n\leq 100,a_i<256\)

\(60\%\)的資料:\(n\leq 100\)

\(100\%\)的資料:\(1\leq q\leq 12,1\leq m\leq n\leq 1000,0\leq a_i<2^\)

solution

值得一提的是,直接\(o(n^3)dp\)是錯誤的。因為它不滿足最優子結構。

code

#includeusing namespace std;

typedef long long ll;

int q,n,m,ans,x,s[1005],f[1005];

int rd()

while ((c>='0')&&(c<='9'))

return re*f;

}int max(int x,int y)

int main()

ans=0;

for (int i=29;i>=0;--i)

}if (f[n]>m) ans|=(1

定義乙個排列 \(a\) 的價值為滿足\(|a[i]-i|\leq 1\) 的 \(i\)的數量。

給出三個正整數 \(n,m,p\),求出長度為$ n $且價值恰好為 \(m\) 的排列的個數對 \(p\) 取

模的結果。

【輸入描述】

第一行兩個正整數 \(t,p\),$t \(為資料組數,\)p $為模數。

接下來 \(t\) 行,每行兩個正整數 \(n,m\)。

【輸出描述】

$t $行,每行乙個非負數,表示答案。

【輸入樣例】

\(5\)

\(1887415157\)

\(3\)

\(1\)

\(3\)

\(2\)

\(3\)

\(3\)

\(50\)

\(10\)

\(1500\)

\(200\)

【輸出樣例】

\(1\)

\(2\)

\(3\)

\(621655247\)

\(825984474\)

【資料範圍】

\(10\%\)的資料:\(n\leq 10\)

\(30\%\)的資料:\(n\leq 15\)

\(50\%\)的資料:\(n\leq 200\)

另有 \(10\%\)的資料:\(m=1\)

另有$ 10%\(的資料:\)m=n-1$

\(100\%\)的資料:\(1\leq t,n,m\leq 2000,2\leq p\leq 10^\)

solution:

題解:因為\(n,m \leq 2000\),而且\(p\)是事先給出的,所以我們可以一次性預處理出\(n,m\leq 2000\)的答案。

考慮乙個長度為\(i\)的排列如何變成長度為\(i+1\)的排列。

一種情況是我在它末尾加入了乙個數\(i+1\),另一種情況是我用\(i+1\)替換掉了原來排列中的乙個數,然後把被換掉的數放到排列的末尾。

那麼,這個排列權值的變化就是:

第一種情況:在它末尾加入了乙個數\(i+1\),權值\(+1\)。

第二種情況:用\(i+1\)替換掉乙個數,權值 \(+=\) 加的貢獻$ -$ 換掉的數的貢獻。

在\(dp\)當中,我們只需要考慮替換掉的數是否是\(i\),以及\(i\)是否在位置\(\frac\)即可。總共有\(5\)種本質不同的狀態,分類討論轉移即可。

複雜度\(o(nm)\)。

code:

#includeusing namespace std;

typedef long long ll;

const int n=2005;

int q,n,m,u,v;

ll p,ans,f[n][n][5],x;

int rd()

while ((c>='0')&&(c<='9'))

return re*f;

}int main()

if (f[i][j][1]>0ll)

} for (;q>0;--q){

cin>>n>>m;

ans=(f[n][m][0]+f[n][m][1]+f[n][m][2]+f[n][m][3]+f[n][m][4])%p;

cout謝謝收看,祝身體健康!

Block Voting 解題報告

這道題做的有點狼狽,效率不高,差一點就tle的ac了。看status裡的,ac的時間大多數都是0ms的。肯定有乙個更有效率的演算法的。下面說下我的狼狽演算法。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1223 問題描述 求每個party的權值。第i...

Safebreaker 解題報告

又是吉林大學一道acm題目,題目很簡單,直接暴力解決。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1718 問題描述 對乙個給定數0000 9999 根據一系列猜測,判斷這個數是否存在,存在的話,是否唯一 例如 3321,給定數 作出猜測,1223 ...

路由 解題報告

路由 問題描述 有乙個tcp ip網路 每台計算機都有乙個或多個網路介面。每個介面根據它的ip位址和子網掩碼來識別 即兩個4位元組的數,兩個字 節之間有乙個 號.子網掩碼有乙個二進位制表示法 有k個 1 然 後是 m 個 0 k m 8 4 32 如 212.220.35.77 是乙個 ip 地 址...