CF895C 平方子串行 線性基 壓位

2021-08-21 10:47:52 字數 1053 閱讀 4492

給定n序列an,從序列中選若干個數,使得乘積為完全平方數,有多少種方案。

兩個方案不同僅當選擇的位置不同。方案數對1e9+7取模。

第一行乙個整數n,n<=100000

第二行n個整數表示ai,ai<=70

輸出方案數對1e9+7取模後的值

1 1 1 1

sample input2

42 2 2 2

sample output2

7sample input3136

sample output3

1由線性基的性質,選出最大線性無關組以後,任選不屬於無關組的元素後都能構成合法的方案,因此答案為pow(2,n-m)-1,其中,m為無關組的秩即大小

對於個數而言:3^3*3與3^5*3等價,類似的:

由唯一分解定理n=p1^k1……pm^km,我們預處理出1~70每個數包含的質因數,顯然,若數n含偶數個數質因子p,則p可以忽略,因此我們只用記錄每個數所含有的奇數個的質因子,注意到1~70只有19個質數,直接壓位即可

#includeusing namespace std;

#define inc(i,l,r) for(register int i=(l);i<=(r);++i)

#define red(i,r,l) for(register int i=(r);i>=(l);--i)

#define ll long long

#define mod (int)(1e9+7)

int pri=;//70以內的質數

int n,fac[77];

struct linear_basis

k^=p[i];

} return k>0;

}}xxj;

inline void init() }}

inline ll quick(ll x,int k)

return ans;

}inline void solv()

cout<<(quick(2,n-num)%mod-1)%mod<<"\n";

}int main()

CF374 C 動態規劃

題目看上去感覺像是dijstra,但是不是最短路,而是在實踐允許的範圍內選擇最多的點去走完從1到n的路,這個想到的是動態規劃,以邊為核心,一條邊一條邊的掃過,如果這條邊對應的起點和終點連線上之後,對於從1到終點來說是有利的就加上那種,我還不是很理解,只是把標程看懂自己敲了一遍而已。include u...

CF369C 思維搜尋

附 原題鏈結 題意 給你n個人,以及要進行k輪遊戲,每個人都有一把槍,在每一輪中,每個活著的人都將搶指向在場上編號最小的那個人身上,編號最小的那個人將槍口指向編號次小的那個人身上。現在已知每個人打中的概率,問k輪內,會有幾種存活情況出現。分析 通過分析,可以得知每一種存活狀態僅對應一種被槍口指向的人...

CF 392 2 C 暴力模擬

cf 392 2 c.unfair poll 題意 n行m列人,老師點k次名。點名次序,每一行都是從1到m,但行是按1,2.n 1 n,n 1 n 2 1,2,3.n 1 n.求點完k次名後被點的最多的次數和最少的次數,以及給定的 x,y 被點次數。總結 有點麻煩,但還是很好找規律,只是fst了,有...