有乙個數列a已知對於所有的a[i]都是1~n的自然數,並且知道對於一些a[i]不能取哪些值,我們定義乙個數列的積為該數列所有元素的乘積,要求你求出所有可能的數列的積的和 mod 1000000007的值,是不是很簡單呢?呵呵!
標籤裡面數論是騙人的(霧),難道是因為有個取模嗎???
這題還是很簡單的,首先觀察資料範圍,發現k比較小,那我們就對它做文章。
我們不妨先求出沒有限制條件下的總和,再減去限制條件造成的影響,這樣複雜度就與k有關了。
假設\(p\)為除了位置\(i\)其餘位置的積,那麼
\(ans=1*p+2*p+\cdots+n*p=(\frac)*p\)
對於任意位置,顯然都是這個東西。
那麼\(ans=)}^m\)。
或者理解作一堆項相乘,\(ans=(1+2+\cdots+n)*(1+2+\cdots+n)*\cdots\)
總共有\(m\)項,就變成上面那個東西。
然後我們考慮限制條件。
先對限制按位置排序,對於乙個位置\(i\)的所有限制條件,若它們的和為\(sum\),很容易看出它們剔除的答案為\(sum*)}^*now\)。其中\(now\)為剔除過限制條件的\(1\sim i-1\)的積。\(now\)的初始值是1,每次剔除都乘上\(\frac-sum\)。
而且,由於每次剔除的位置對最後結果無影響,離散化。
複雜度\(o(klogm+klogk)\)。
我的**寫的比較鬼畜,還請各位大佬見諒qwq。
參考**
#include#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define n 100010
#define mod 2520
#define e 1e-12
#define ll long long
#define mod 1000000007
#define div 500000004
using namespace std;
inline int read()
while(c>='0'&&c<='9')
return x*f;
}ll n,m,k,sum[n];
sets[n];
struct node
}a[n];
inline ll qp(ll a,ll b)return ans%mod;}
int main()
else s[++cnt].insert(a[i].x),sum[cnt]=(sum[cnt]%mod+a[i].x%mod)%mod;
pos=a[i].pos;
}//腦抽寫的set離散化
ll tmp=(n%mod*(n+1)%mod*div%mod)%mod;
ll ans=qp(tmp,m)%mod;
ll now=1;
for(int i=1;i<=cnt;++i)
printf("%lld\n",ans%mod);
return 0;
}
P2220 HAOI2012 容易題 快速冪
為了使得大家高興,小q特意出個自認為的簡單題 easy 來滿足大家,這道簡單題是描述如下 有乙個數列a已知對於所有的a i 都是1 n的自然數,並且知道對於一些a i 不能取哪些值,我們定義乙個數列的積為該數列所有元素的乘積,要求你求出所有可能的數列的積的和 mod 1000000007的值,是不是...
洛谷 2220 HAOI2012 容易題
題目描述 為了使得大家高興,小q特意出個自認為的簡單題 easy 來滿足大家,這道簡單題是描述如下 有乙個數列a已知對於所有的a i 都是1 n的自然數,並且知道對於一些a i 不能取哪些值,我們定義乙個數列的積為該數列所有元素的乘積,要求你求出所有可能的數列的積的和 mod 1000000007的...
數論 HAOI2012 容易題
問題描述 為了使得大家高興,小q特意出個自認為的簡單題 easy 來滿足大家,這道簡單題是描述如下 有乙個數列a已知對於所有的a i 都是1 n的自然數,並且知道對於一些a i 不能取哪些值,我們定義乙個數列的積為該數列所有元素的乘積,要求你求出所有可能的數列的積的和 mod 1000000007的...