我是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 ...