省選模擬2

2022-09-14 14:09:13 字數 2692 閱讀 7311

前 \(n\) 個正整數劃分成 \(m\) 個集合,不存在乙個分解線使得劃分出來的值域分開

那麼設 \(f_\) 表示將前 \(i\) 數劃分到 \(j\) 個集合裡,其中還剩 \(k\) 個集合沒有達到最大值

那麼答案就是 \(f_\) 邊界 \(f_=1\) 對於 \(i\neq0,n\)

\(f_=0\)

轉移的話分別考慮是否新開乙個集合,是否讓乙個集合達到最大值

\(f_=f_+f_+kf_}\)

code

#include#define int long long

#define rint signed

#define mod 998244353

#define inf 0x3f3f3f3f3f3f3f3f

using namespace std;

inline int read()

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

return x*f;

}int n,m;

int f[2][510][510],cur;

signed main()

} printf("%lld\n",f[cur^1][m][0]);

return 0;

}

第一種回答直接暴力求和然後 \(o(\sqrt n)\) 分解求尤拉函式

尤拉函式相當於將 \(n\) 分解質因數變成這樣的形式 \(n=\prod\limits_^p_i^\)

然後 \(\varphi(n)=n\times\prod\limits_^\frac\)

於是只要求出乘積和質因數是什麼就行了

乘積可以樸素的解決,質因數用 \(bitset\) 記錄就行,每次合併

code

#include#define int long long

#define rint signed

#define lson rt<<1

#define rson rt<<1|1

#define mod 1000000007

#define inf 0x3f3f3f3f3f3f3f3f

using namespace std;

inline int read()

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

return x*f;

}int n,q;

int a[50010],inv[50010];

int prime[50010],id[50010],phi[50010],g[50010],cnt;

bool is[50010];

bitset<4210>b;

struct segst[50010*4];

bitset<4210> getfac(int x)

return tmp;

}inline int qpow(int x,int k)

return res;

}inline int euler(int x)

if(x!=1) res-=res/x;

return res;

}inline void pushup(int rt)

void build(int rt,int l,int r)

void upd(int rt,int l,int r,int pos,int k)

int querys(int rt,int l,int r,int l,int r)

int queryphi(int rt,int l,int r,int l,int r)

signed main()

phi[i*prime[j]]=phi[i]*phi[prime[j]];

} }n=read(),q=read();

for(int i=1;i<=n;i++) a[i]=read();

build(1,1,n);

for(int i=1,op,l,r,res;i<=q;i++)else if(op==1)else

} return 0;

}

\(30pts\) 暴力證明可以參考圓上的整點

總之就是將 \(r\) 分解質因數

如果 \(\%4=1\) 那麼貢獻 \(2*k+1\)

然後預處理篩一下,在給每個數分解就行了

正解不會

code

#include#define int long long

#define rint signed

#define inf 0x3f3f3f3f3f3f3f3f

using namespace std;

inline int read()

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

return x*f;

}int n,r,ans;

int prime[10000010],g[10000010],cnt;

bool is[10000010];

inline int getfac(int x)

return res*4;

}signed main()

} r=read(),n=read();

for(int i=1;i<=r;i++) if(getfac(i)==n) ans++;

printf("%lld\n",ans);

return 0;

}

省選模擬2 題解

暴力插頭dp 網路流判斷可行性,可以拿到85分。然而這個題看起來就很像無限之環,只要稍微改一下建圖就好了。然而這個建圖還蠻難想到的。因為不會做 看不懂題解 std太長,所以咕掉了。70分部分分 考慮到狀態數很少,直接暴力狀壓dp就好了 可以用vector map記錄狀態 然而題解第一步的轉化題意就很...

省選模擬 19 09 11

ps.博主趁資訊課摸魚考的暴零模擬 看門人憑感覺就知道是長鏈剖分,將路徑查分一下,dis u di sv 2 dis lc adis u dis v 2 dis disu disv 2 disl ca 維護fu,if fu,i 表示u的子樹,深度為 i 的點的 dis disdi s最大值 考慮如何...

省選模擬96

容易發現當 k 3 時無解。然後容易證明當 k 3 時,只有 m 3 才是有解的。然後直接做不好做,考慮欽定然後容斥出合法方案。對於 k 3 列舉乙個點,然後計算另乙個的方案數。其他情況類似,欽定滿足條件的角,然後容斥。然後對於每乙個 o n 的式子用組合恒等式大力化簡就可以做到 o 1 了。考慮每...