[BZOJ3601]一個人的數論-題解
【題目地址】
題意簡述
給你,求下面式子在意義下的值。
其中特別大,所以我們給你一個,然後給你兩個陣列,其中:
我們仍舊先推一波式子:
後面部分就是自然數冪的字首和,拉格朗日差值就可以了,在時間內求出,而前面是可以杜教篩的:
我們令,然後就等於:
所以,然後套入杜教篩公式即可:
然後就可以在的時間內解決了。
等等,好像有左右,-_-||。
但是不是就這樣束手就擒,打暴力去了呢?
不,我們離正解還差一步了。
但是,我們根據拉格朗日差值的經驗可以知道,為一個次多項式,那麼我們令,同時我們也可以知道,假設我們求出了所有,我們將其帶入式子,看看有沒有什麼奇妙的反應:
現在我們主要是要解決後半部分的快速求法,我們令,那麼我們知道,那麼根據都為積性函式,而積性函式的狄利克雷卷積都為積性函式,所以我們可以知道也是一個積性函式。
這裡,我們看,題目都將的質因數幫我們分解好了凱森(ノ ̄▽ ̄),所以我們將質因數分開考慮,因為,所以此時,我們只需知道如何計算:
我們看原式
而根據的定義,我們知道當時的時候,所以,那麼就等於:
那麼列舉,然後列舉,然後算就用快速冪,複雜度就是(因為根據尤拉定理和費馬小定理,我們可以將指數)。
好啦,就解決啦!ヾ(@^▽^@)ノ
等等辣QAQ,好像還沒說怎麼求-_-||。
其實,我們知道它是一個次多項式的係數,那麼高斯消元就好啦,我們列出的方程即可。
前面回顧:
這個方程組的初始化,我們每次列舉,然後用快速冪計算出當前的的值,然後列舉,依次計算出作為係數即可,然後就是高斯消元板子啦~~
醜陋的加調了半天的程式碼_(¦3」∠)_:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e3+10,M=1e2+10;
const ll Mod=1e9+7;
int d,w;
ll fpow(ll a,ll b){
ll res=1;
for(;b;b>>=1,a=(a*a)%Mod)
if(b&1)res=(res*a)%Mod;
return res;
}
ll A[M][M],X[M],P[N],C[N];
void Guass(){
int D=d+1;
for(ll i=0,sum=0,x;i<=D;i++){
x=1;sum=(sum+fpow(i,d))%Mod;
A[i][D+1]=sum;
for(ll j=0;j<=D;j++){
A[i][j]=x;x=(x*i)%Mod;
}
}
for(int now=0,pos;now<=D;now++){
pos=now;
if(!A[pos][now])
for(int i=now+1;i<=D;i++)
if(A[i][now]){pos=i;break;}
if(pos!=now)swap(A[now],A[pos]);
ll inv=fpow(A[now][now],Mod-2);
for(int i=now+1;i<=D;i++){
ll tt=(A[i][now]*inv)%Mod;
for(int j=0;j<=D+1;j++){
A[i][j]=(A[i][j]-A[now][j]*tt%Mod)%Mod;
if(A[i][j]<0)A[i][j]+=Mod;
}
}
}
for(int i=D;i>=0;i--){
for(int j=D;j>=i+1;j--){
A[i][D+1]=(A[i][D+1]-A[i][j]*X[j]%Mod)%Mod;
if(A[i][D+1]<0)A[i][D+1]+=Mod;
}
X[i]=A[i][D+1]*fpow(A[i][i],Mod-2)%Mod;
}
}
ll GetH(ll a,ll b){
ll p1=C[b]*a%(Mod-1);
ll p2=(p1+d-a)%(Mod-1);if(p2<0)p2+=(Mod-1);
ll ans=(fpow(P[b],p1)-fpow(P[b],p2))%Mod;
if(ans<0)ans+=Mod;
return ans;
}
ll ans;
int main(){
scanf("%d%d",&d,&w);
Guass();
for(int i=1;i<=w;i++)scanf("%lld%lld",&P[i],&C[i]);
for(int i=0,D=d+1;i<=D;i++){
ll xx=X[i];
for(int j=1;j<=w;j++)xx=(xx*GetH(i,j))%Mod;
ans=(ans+xx)%Mod;
}
printf("%lld\n",ans);
return 0;
}
End
元旦節只放一天,1月1日還要在學校度過,慘兮兮QWQ
相關文章
- [SDOI2015]約數個數和-[BZOJ4176]Lucas的數論-題解
- 怎樣解題|題7.5.12:因數的個數
- Hibernate 一個更新問題的 討論
- 用Python解決一個等差數列的求和問題Python
- 記一個有趣的數學題
- 關於一個最簡單的數獨解題實現與疑惑一
- Atcoder ABC342D Square Pair 題解 [ 綠 ] [ 數論 ] [ 唯一分解定理 ]AI
- 面試題解:輸入一個數A,找到大於A的一個最小數B,且B中不存在連續相等的兩個數字面試題
- P5655 基礎數論函式練習題 題解函式
- Educational Codeforces Round 166 個人題解(A~D)
- 「數論難題解答」
- [每日一題] 第二十題:最小的k個數每日一題
- 看教程累了,測了一下論壇的註冊人數
- LeetCode題解(1639):統計只差一個字元的子串數目(Python)LeetCode字元Python
- 數學界難題「abc猜想」宣告解決?望月新一論文終獲發表,全球幾乎無人能懂
- 一個關於月球車的筆試題--求討論筆試
- n個人圍成一圈,第一個人從1開始數數,數到3的倍數的人離開,最後剩的人是第幾個
- 關於 Laravel 的一些個人見解Laravel
- [每日一題] 第十六題:n個骰子的點數每日一題
- LeetCode刷題的一點個人建議和心得LeetCode
- 數論概論中的費馬降階法求一個質數分解成2個數的平方和與窮舉法的效率比較
- LeetCode每日一題: 位1的個數(No.191)LeetCode每日一題
- 從一個問題中瞭解數學在程式設計中的應用程式設計
- 一道小學數學題的解決
- 此貼討論一下 AI 在 UI 自動化中的應用,以及個人的一個想法AIUI
- Codeforces Round 991 div3 個人題解(A~G)
- Codeforces Round 988 div3 個人題解(A~G)
- 牛客周賽Round 67 個人題解(A~F)
- Codeforces Round 983 div2 個人題解(A~D)
- Codeforces Round 984 div3 個人題解(A~F)
- Codeforces Round 980 div2 個人題解(A~D)
- Codeforces Round 979 div2 個人題解(A~E)
- Codeforces Round 981 div3 個人題解(A~G)
- Codeforces Round 979 (Div. 2) (ABCD個人題解)
- Codeforces Rund 976 div2 個人題解(A~E)
- 錯誤程式碼的個人見解以及邏輯分析題
- 【學校訓練記錄】10月個人訓練賽3個人題解
- 個人python面試準備的一些題型Python面試