2024杭电多校3——1001深度自同构

在这里插入图片描述
一开始和队友想出来的式子,pip_ipiiii的因子数组
ans[i]=∑i=1kans[(i−pi)/pi]ans[i] = \sum_{i=1}^{k} ans[(i-p_i)/p_i]ans[i]=i=1kans[(ipi)/pi]
一个O(nn)O(n\sqrt n)O(nn)的dp显然是过不了的
然后想到了对每个数枚举倍数预处理因子的话计算的话,时间复杂度是O(nlnn)O(nlnn)O(nlnn),因为是ni+ni+1+....+nn\frac{n}{i}+\frac{n}{i+1}+....+\frac{n}{n}in+i+1n+....+nn约等于nlnnnlnnnlnn
发现还是TLE,STL常数太大了,队友突然想到可以直接算
设当前数字是iii,枚举倍数jjj,ans[i∗j]+=ans[(i∗j−j)/j]+=ans[i−1]ans[i*j] += ans[(i*j-j)/j] +=ans[i-1]ans[ij]+=ans[(ijj)/j]+=ans[i1], ans[i−1]ans[i-1]ans[i1]已经算过了,可以进行转移,另外特殊处理因子是iii本身的情况,+1+1+1即可

#include <bits/stdc++.h>
using namespace std;

const int mod = 998244353;
int n;
long long ans[1000100];
int main() {
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i = 1;i<=1e6;++i){
        ans[i]+=1;
        for(int j = 1;j<=1e6/(i+1);++j){
            ans[(i+1)*j]=(ans[(i+1)*j]+ans[i])%mod;
        }
    }
    for(int i = 1;i<=n;++i) cout<<ans[i]%mod<<" ";
    return 0;
}

太菜啦QAQ,少用STL

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值