P3321 SDOI2015 序列統計

2022-05-01 21:00:12 字數 1247 閱讀 7895

首先有個挺顯然的dp

\[dp[i][(j*k)\%m]+=dp[i-1][j]\times dp[i-1][k]

\]想辦法優化這個dp

這個dp也可以寫成這樣

\[dp[i][j]=\sum_dp[i-1][p]\times dp[i-1][q]

\]看著一副卷積的樣子

但是是乘法,可以考慮轉化乘法為加法,有兩種方式,取ln或者原根

注意到m是質數,所以取原根,每層之間的轉移就變成卷積了

但是這題的卷積下標是模m的,所以每次乘完都要把大於m-1的加到對應項上(i+m-1和i對應)所以好像不能直接多項式快速冪

n是\(10^9\),上個類似快速冪的倍增即可

複雜度是\(o(m \log m \log n)​\)

#include #include #include #include #include #define int long long

using namespace std;

const int mod = 1004535809;

const int g = 3;

const int invg = 334845270;

const int maxn = 140000;

namespace getg

}if(n>1)

ans=ans/n*(n-1);

return ans;

} int my_pow(int a,int b,int mod)

return ans;

} int g(int m)

if(mid>1)

q[++cnt]=phi/mid;

for(int g=2;1;g++)

}if(f)

return g;}}

};int rev[maxn];

int my_pow(int a,int b)

return ans;

}void cal_rev(int n,int lim)

void ntt(int *a,int opt,int n,int lim)

}int n,m,pos[maxn],s,x,a[maxn],b[maxn];

signed main()

for(int i=1;i<=s;i++)

my_pow(a,b,m-1,m,n);

printf("%lld\n",b[pos[x]]);

return 0;

}

Luogu 3321 SDOI2015 序列統計

bzoj 3992 點開這道題之後才發現我對原根的理解大概只停留在 998244353 的原根是 3 關於原根 點我 首先寫出 dp 方程,設 f 表示序列長度為 i 當前所有數乘積模 m 為 j 的方案數,有轉移 f sum f 把 x 和 y 取個對數就可以變成卷積的形式了。然而在模意義下,我們...

SDOI2015 序列統計

time limit 30 sec memory limit 128 mb submit 1829 solved 870 submit status discuss 小c有乙個集合s,裡面的元素都是小於m的非負整數。他用程式編寫了乙個數列生成器,可以生成乙個長度為n的數 列,數列中的每個數都屬於集合...

SDOI2015 序列統計

description 小c有乙個集合s,裡面的元素都是小於m的非負整數。他用程式編寫了乙個數列生成器,可以生成乙個長度為n的數列,數列中的每個數都屬於集合s。小c用這個生成器生成了許多這樣的數列。但是小c有乙個問題需要你的幫助 給定整數x,求所有可以生成出的,且滿足數列中所有數的乘積mod m的值...