捞 TLE 30pts 求助

P5221 Product

我先来:帮Imken求调
by SqrtSecond @ 2023-06-25 21:33:53


@[SqrtSecond](/user/217233) 你差不多得了你帮不帮我
by QAQ__ @ 2023-06-25 21:38:26


@[SqrtSecond](/user/217233) 满足一个高二期末之人的临终遗愿好不好
by QAQ__ @ 2023-06-25 21:38:47


@[QAQ__](/user/627636) 抱歉我没时间((( 我尽量帮你看看
by SqrtSecond @ 2023-06-25 21:40:24


@[Caiest_Oier](/user/932169) 线性筛都 $O(n)$ 了,瓶颈不在整除分块吧
by QAQ__ @ 2023-06-25 21:45:01


@[QAQ__](/user/627636) 事实证明,改为分块就过了
by Caiest_Oier @ 2023-06-25 21:57:14


@[QAQ__](/user/627636) ```cpp #include <bits/stdc++.h> using namespace std; int phi[1000005], prime[1000005]; bool is_prime[1000005]; long long g=1; long long qp(long long n, long long m, long long p){ long long ans=1,base=n; while(m){ if(m&1)(ans*=base)%=p; (base*=base)%=p; m>>=1; } return ans; } void pre() { for (int i = 1; i <= 1000000; i++) { is_prime[i] = 1; } int cnt = 0; is_prime[1] = 0; phi[1] = 1; for (int i = 2; i <= 1000000; i++) { if (is_prime[i]) { prime[++cnt] = i; phi[i] = i - 1; } for (int j = 1; j <= cnt && i * prime[j] <= 1000000; j++){ is_prime[i * prime[j]] = 0; if (i % prime[j])phi[i * prime[j]] = phi[i] * phi[prime[j]]; else { phi[i * prime[j]] = phi[i] * prime[j]; break; } } } } int main() { long long n; pre(); for (int i=1; i<=1000000; i++) (phi[i] += phi[i-1]) %= 104857600; long long prod = 1; cin>>n; for(int i=1; i<=n; i++)(prod *= i) %= 104857601; prod=qp(prod,2*n,104857601); for(int i=1;i<=n;i++){ g=(g*i)%104857601; if((n/i)!=(n/(i+1))||i==n){ (prod*=qp(qp(g,4*phi[n/i]-2,104857601),104857599,104857601))%=104857601; g=1; } } cout<<prod<<endl; return 0; } ```
by Caiest_Oier @ 2023-06-25 21:57:48


乘的时候不要每个都乘上去,n/i发生变化的时候再一气乘上去
by Caiest_Oier @ 2023-06-25 21:58:31


@[Caiest_Oier](/user/932169) 谢谢,贴贴 kyst(
by QAQ__ @ 2023-06-25 22:00:20


|