這道題本來不想寫部落格的……但是鑑於自己犯了低階錯誤,還是寫篇部落格記載一下。
一開始我的想法和題解裡面的演算法而比較類似,也是先分解質因數,然後用質因子是否出現偶數次來判斷當前這個數是否是完全平方數……
然而這樣並不能ac,於是我去翻了題解……\(get\)了乙個新做法,就是給每個出現過的質因子賦乙個\([0,2^)\)的隨機值,那麼判斷乙個質因子是否出現偶數次就只需要判斷異或和是否為零了。算一算可以發現衝突的概率非常小(但是我不會算)。
然後……我就愉快的寫了一發樹分治……就當我練了一發板子好了(正好儲存乙份樹分治板子)……
下面貼**:
#include#include#include#include#include#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)#define maxn 100010
#define maxp 10010
#define mod 999983
using namespace std;
typedef unsigned long long llg;
int pri[maxp],lp,a[maxn],la,n,d[maxn];
int head[maxn],next[maxn<<1],to[maxn<<1],tt;
int w[maxn],siz[maxn],maxv[maxn],ld;
int h1[mod],n1[mod],ci[mod],_t,hd[mod],_d;
llg c1[maxn],val[maxn],c[maxn<<1],ans,inf,t1[mod];
bool vis[maxn];
int getint()
llg ra()
void link(int x,int y)
void pre()
for(int i=1;i這道題既然是要異或和為零,那麼何必樹分治呢?我們只需\(dfs\)一遍,記錄每個節點到根的異或和,然後兩個節點之間的異或和就可以由這兩個節點到根的異或和異或得到。因為\(lca\)上面那一截會消掉……
這已經不是第一次犯這種低階錯誤了,所以我在這裡記錄下來。**比之前短了很多,也快了很多,感人(強行增加複雜度我就是個\(zz\))
下面貼**:
#include#include#include#include#include#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 100010
#define maxp 10010
#define mod 999983
using namespace std;
typedef unsigned long long llg;
int pri[maxp],lp,a[maxn],la,n,w[maxn],ld;
int head[maxn],next[maxn<<1],to[maxn<<1],tt;
llg c[maxn<<1],ans,val[maxn],d[maxn];
bool vis[maxn];
int getint()
llg ra()
void link(int x,int y)
void pre()
dfs(1,0,0); sort(d+1,d+ld+1);
for(int i=1,j;j=i,i<=ld;i=j+1)
printf("%lld\n",ans);
return 0;
}
UOJ 192 UR 14 最強跳蚤
題目鏈結 暑期課第二天 樹上問題高階 具體內容看筆記部落格吧 題意n個節點的樹t 邊有邊權w 求滿足 u,v 上所有邊權乘積為完全平方數的路徑有多少條 看到 所有邊權乘積為完全平方數 想到完全平方數的特殊性 就是分解質因數後 質因數指數都為偶數 然後就想到分解邊權質因數 判質路徑邊權奇偶性 後者由於...
uoj 513 UR 19 清掃銀河
很簽到題 操作2先假設全部為黑,那麼變成了每選乙個點便會取反相連的邊 如果能暴力搞出所有環就可以高斯消元判斷,也許能過40 對原圖建dfs樹,發現只需要保留返祖邊加上對應路徑的環即可,任何的環都可以通過這些環異或得到,於是環的個數變為m級別,高斯消元o m 3 可以70 設返祖邊 u,v,w 的選擇...
UOJ 242 UR 16 破壞蛋糕
一句話題意 平面上有 n 1條直線,前 n 條直線把平面分成許多塊,這些塊有些面積有限,有些面積無限,而第 n 1 條直線不經過前 n 條直線的交點,且一定不和前 n 條直線中的任意一條平行,求第 n 1 條直線被前 n 條直線劃分成的 n 1 段中哪些在面積有限的塊裡,哪些在面積無限的塊裡。保證第...