SNOI2017 遺失的答案

2022-05-07 19:06:05 字數 1330 閱讀 3601

loj

首先可以考慮把\(n \rightarrow n/g,l \rightarrow l/g\),這是很顯然的.

然後考慮所有可能出現的質因數就是\(l\)的質因數,所以可以對\(l\)進行質因數分解.

接著考慮設\(f_\)表示最小集為\(s1\),最大集為\(s2\)的狀態的方案數,這個很顯然可以\(dp\).

這個時候我們需要強制乙個數字在裡面,相當於是強制他不在裡面然後查他的超集的方案數.

所以可以前字尾\(dp\)然後做乙個\(fmt\),求出來每乙個不在裡面的方案數,最後做乙個超集和就可以了.

#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define rep(a,b,c) for(int a=b;a<=c;a++)

#define re register

#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)

typedef pairpii;

#define mp make_pair

inline int gi()

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

return f*sum;

}const int n=10010,lim=1<<16,mx=18,mod=1e9+7,inv=500000004;

int n,g,l,q,prime[n],s,p[n],mx[n],tot,cnt[lim];

bool is_prime[n];

void init() }}

void calc(int x)

if(x>1)p[++tot]=x,mx[tot]=1;

}void dfs(int d,int s,int s1,int s2)

}int o[lim],s[lim],suf[810][lim],pre[810][lim],f[lim],tmp[lim];

int qpow(int a,int b)return ret;}

void fmt(int *a,int limit,int opt)

int ss=get(x),p=lower_bound(o+1,o+s+1,ss)-o-1;

int v=pre[p][(lim-1)^ss];

printf("%lld\n",1ll*v*(cnt[p+1]+1)%mod*inv%mod);

} return 0;

}

SNOI2017 乙個簡單的詢問

給定乙個長度為 n n le50000 的序列 a 1 le a i le n 定義 operatorname l,r,x 為區間 a 中 x 的出現次數。m m le50000 次詢問,每次給出 l 1,r 1,l 2,r 2 求 sum operatorname l 1,r 1,x cdot o...

bzoj5018 Snoi2017 英雄聯盟

description 正在上大學的小皮球熱愛英雄聯盟這款遊戲,而且打的很菜,被們戲稱為 小學生 現在,小皮球終於受不 了們的嘲諷,決定變強了,他變強的方法就是 買 小皮球只會玩n個英雄,因此,他也只準備給這n個英 雄買 並且決定,以後只玩有 的英雄。這n個英雄中,第i個英雄有ki款 是每款ciq幣...

bzoj5018 Snoi2017 英雄聯盟

題目 嗯,其實吧,還是算比較顯然的dp。f i j 表示前 i個英雄 用了j 元錢的最 多方案數 最後答 案就是滿 足f n j m最小 的j了。轉移方法,首先 肯定要 列舉i,然後列舉 當前買幾 個 j 再列舉 l表示f i l 從什 麼轉移過 來。注意 每次l 的上界是 當前買所 有 的 這樣,...