51nod 1822 序列求和 V5

2022-05-08 04:03:09 字數 3521 閱讀 6851

我是zz吧

nonprime[i * prime[j]] = 0

= =還以為是要卡常,卡了半天就是過不掉

我們來說這道題……

首先,我們考慮乙個\(k^2\)做法

\(f_(n) = \sum_^ i^r^\)

\((r - 1)f_(n) = \sum_^i^r^ - \sum_^ i^r^\)

\((r - 1)f_(n) = n^r^ + \sum_^ [(i - 1)^ - i^]r^\)

\((r - 1)f_(n) = n^r^ + \sum_^ [\sum_^(-1)^\binomi^ - i^]r^\)

\((r - 1)f_(n) = n^r^ + \sum_^ \sum_^(-1)^\binomi^r^\)

\((r - 1)f_(n) = n^r^ + \sum_^(-1)^\binom\sum_^ i^r^\)

\((r - 1)f_(n) = n^r^ + \sum_^(-1)^\binom f_(n)\)

似乎。。。沒法搞了

然而我們可以試試暴力展開一下

\(f_(n) = \frac - r} = r^\cdot (\frac) - r\cdot (\frac)\)

$f_(n) = \frac} - \frac(n)} = r^(\frac - \frac}) - r\cdot (-\frac) \(

\)f_(n) = \fracr} - \frac(n)} + \frac(n)}= r^(\frac} - \frac} + \frac} + \frac}) - r\cdot (\frac + \frac}) $

我們可以猜測,並且歸納證明這個結論

\(f_(n) = r^ f_(n) - f_(0)\)

其中\(f_(n)\)是乙個k次多項式

證明了多項式,那麼就考慮插值

如何插值,我們發現按照定義有$f_(n + 1)= \frac(n)} + (n + 1)^ \(

我們設\)f_(0) = x\(,然後用x表示剩下\)k + 1$個多項式

同時,我們嘗試用插值法表示出\(f_(k + 1)\)

式子經過整理後也就是

\(f_(x) = \sum_^ (-1)^\binom\binom f_(i)\)

當\(x = k + 1\)時

有\(f_(k + 1) = \sum_^ (-1)^\binomf_(i)\)

也就是\(\sum_^ (-1)^\binomf_(i) = 0\)

代入即可解出\(f_(0)\)從而求出f的每個點值

#include #include #include #include #include #include #include #include //#define ivorysi

#define eps 1e-8

#define mo 974711

#define pb push_back

#define mp make_pair

#define pii pair#define fi first

#define se second

#define maxn 200005

#define space putchar(' ')

#define enter putchar('\n')

using namespace std;

typedef long long int64;

typedef unsigned int u32;

typedef unsigned long long u64;

typedef double db;

templatevoid read(t &res)

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

res *= f;

}templatevoid out(t x)

putchar('0' + x % 10);

}const int64 mod = 985661441;

int64 fpow(int64 x,int64 c)

return res;

}int t,k;

int prime[maxn],tot;

int64 n,r,f[maxn];

int64 a[maxn],b[maxn];

int64 mk[maxn];

int64 fac[maxn],invfac[maxn],le[maxn],ri[maxn];

bool nonprime[maxn];

int64 c(int n,int m)

void solve()

mk[1] = 1;

memset(nonprime,0,sizeof(nonprime));

tot = 0;

for(int i = 2 ; i <= k + 2 ; ++i)

for(int j = 1 ; j <= tot ; ++j)

}if(r == 1)

int64 t = 1,ans = 0;

le[0] = 1;

n %= mod;

for(int i = 1 ; i <= k + 2 ; ++i)

ri[k + 3] = 1;

for(int i = k + 2 ; i >= 1 ; --i)

for(int i = k + 2 ; i >= 1 ; --i)

ans %= mod;

out(ans);enter;return;

}a[0] = 1,b[0] = 0;

int64 invr = fpow(r,mod - 2);

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

int64 suma = 0,sumb = 0,t = 1;

if(k & 1) t = mod - 1;

for(int i = 0 ; i <= k + 1; ++i)

f[0] = (mod - sumb) * fpow(suma,mod - 2) % mod;

for(int i = 1 ; i <= k + 1; ++i) f[i] = (a[i] * f[0] + b[i]) % mod;

int64 ans = 0;

t = 1;

if(n <= k)

int64 t = n % (mod - 1);

n %= mod;

le[0] = n;

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

ri[k + 1] = 1;

for(int i = k ; i >= 0 ; --i)

if(k & 1) t = mod - 1;

for(int i = 0 ; i <= k; ++i)

ans %= mod;

ans = (ans * fpow(r,t) - f[0] + mod) % mod;

out(ans);enter;

}int main()

return 0;

}

51nod 1229 序列求和 V2

題解 需要先推遞推公式,發現遞推後,直接o k 2 暴力找就行,注意當r 1的時候,分母為0,需要特判,使用fold篩處理。題目鏈結 includeusing namespace std typedef long long int ll const int maxn 2e3 10 const ll ...

51nod1228 序列求和

設t n n k,s n n i 1t i 給出n和k,求s n 例如k 2,n 5,s n 1 2 2 2 3 2 4 2 5 2 55。由於結果很大,輸出s n mod 1000000007的結果即可。t 5000 k 2000 n 10 18 n很大,所以複雜度不應該帶n 關於求自然數冪和,這...

51nod 1228 序列求和

t n n k,s n t 1 t 2 t n 給出n和k,求s n 例如k 2,n 5,s n 1 2 2 2 3 2 4 2 5 2 55。由於結果很大,輸出s n mod 1000000007的結果即可。input 第1行 乙個數t,表示後面用作輸入測試的數的數量。1 t 5000 第2 t ...