51NOD1965 奇怪的式子

2022-05-07 18:45:08 字數 2503 閱讀 5880

傳送門

拆開變成

\[\prod_^\sigma_0(i)^\prod_^\sigma_0(i)^

\]考慮 \(\prod_^\sigma_0(i)^\)

運用 \(\mu\) 的性質,設 \(c(i)\) 表示 \(i\) 的質數因子個數

那麼就是

\[\prod_^2^=2^^\mu(i)c(i)}

\]只需要設

\(f(x,j)\) 表示 \(1\) 到 \(x\) 最小質因子大於等於第 \(j\) 個質數的合數的 \(\mu(i)c(i)\) 的和

\(g(x,j)\) 表示 \(1\) 到 \(x\) 最小質因子大於等於第 \(j\) 個質數的合數的 \(\mu(i)\) 的和

預處理出 \(cntp(i)\) 表示 \(1\) 到 \(x\) 的質數個數就可以遞推了

這一部分直接 \(min25\) 篩即可

考慮 \(\prod_^\sigma_0(i)^\)

分開考慮每個質數的貢獻

設 \(s(n,p,k)\) 表示 \(1\) 到 \(n\) 中只含有 \(p^k\) 這個因子不含 \(p^i,i\ne k\) 的數的和

設 \(p\) 為質數集合

那麼\[\prod_^\sigma_0(i)^=\prod_\prod_(k+1)^

\]設 \(sum(x)=\sum_^i\)

那麼\[s(n,p,k)=p^ksum(\lfloor\frac\rfloor)-p^sum(\lfloor\frac}\rfloor)

\]當 \(p\le \sqrt\) 的時候直接暴力計算

當 \(p > \sqrt\) 的時候,顯然 \(k\) 最多就是 \(1\)

那麼\[s(n,p,k)=psum(\lfloor\frac\rfloor)

\]\(min25\) 篩預處理出 \(s(x)\) 表示 \(1\) 到 \(x\) 的質數的和,然後數論分塊即可

注意常數優化qwq

# include using namespace std;

typedef long long ll;

const ll mod(1e12 + 39);

const ll phi(1e12 + 38);

const int maxn(1e6 + 5);

inline ll mul1(ll x, ll y)

inline ll mul2(ll x, ll y)

inline ll pow(ll x, ll y)

inline void inc1(ll &x, ll y)

inline void inc2(ll &x, ll y)

inline ll dec1(ll x, ll y)

inline ll dec2(ll x, ll y)

int test, pr[maxn], tot, d, id1[maxn], id2[maxn], cnt;

ll n, val[maxn], cntp[maxn], f[maxn], g[maxn], s[maxn], sp[maxn];

bitset ispr;

# define id(x) ((x) <= d ? id1[x] : id2[n / (x)])

inline ll sum1(ll x)

inline ll sum2(ll x)

inline ll getsum(ll x, ll v1, ll v2)

inline void solve()

for (i = 1; i <= tot && pr[i] <= n / pr[i]; ++i)

for (j = 1; j <= cnt && pr[i] <= val[j] / pr[i]; ++j)

for (--i; i; --i)

for (j = 1; j <= cnt && pr[i] <= val[j] / pr[i]; ++j)

for (i = 1; i <= cnt; ++i) inc2(f[i], phi - cntp[i]);

ans1 = pow(2, f[id(n)]), ans2 = 1;

for (i = 1; i <= tot && pr[i] <= n / pr[i]; ++i)

for (j = 1, v = pr[i]; v <= n; v = v * pr[i], ++j) ans2 = mul1(ans2, pow(j + 1, getsum(n, v, v * pr[i])));

for (lst = sp[i - 1], ret = 0, i = pr[i]; i <= n; i = j + 1)

ans2 = mul1(ans2, pow(2, ret)), printf("%lld\n", mul1(ans1, ans2));

}int main()

} scanf("%d", &test);

while (test) scanf("%lld", &n), solve(), --test;

return 0;

}

51NOD1965 奇怪的式子 min 25篩

給你 n 求 prod n 對 39 取模。sigma 0 i 表示約數個數。把式子拆成兩部分 prod n prod n prod n 先看前面這部分 begin s n sum ni frac prod n sigma 0 i i prod prod p s frac prod prod p s...

51 nod 最高的獎勵

有n個任務,每個任務有乙個最晚結束時間以及乙個對應的獎勵。在結束時間之前完成該任務,就可以獲得對應的獎勵。完成每乙個任務所需的時間都是1個單位時間。有時候完成所有任務是不可能的,因為時間上可能會有衝突,這需要你來取捨。求能夠獲得的最高獎勵。input 第1行 乙個數n,表示任務的數量 2 n 500...

51Nod 1241 特殊的排序

題目傳送門 分析 之前想的是求lis,後面發現這組資料會出問題 3 1 2 4 5 6。其實這裡的lis還應當滿足前後兩個元素的值相差為1。比如上面的最長子串行為 3 4 5 6,而不是1 2 4 5 6。即只需移動1 2即可。即如果n個數最長連續上公升子串行 這裡的連續指數值上連續,即前後相差1 ...