洛谷 P3750 [六省联考2017]分手是祝愿 dp

题目:
https://www.luogu.org/problemnew/show/P3750

分析:
显然按一个开关不能使得比他大的数熄灭。所以最优方案一定是每次选出最大的数按掉。
可以用枚举倍数,然后用vector存某个数的约数,求出需要按的开关数 c n t cnt cnt
f [ i ] f[i] f[i]表示还有 i i i个开关需要按到还有 i − 1 i-1 i1个开关需要按的情况期望需要多少步,
显然
f [ i ] = i n + n − i n ∗ ( f [ i + 1 ] + f [ i ] + 1 ) f[i]=\frac{i}{n}+\frac{n-i}{n}*(f[i+1]+f[i]+1) f[i]=ni+nni(f[i+1]+f[i]+1)
前面的表示直接按到了需要按的开关,后面表示没有按到,那么就需要按 i + 1 i+1 i+1个开关到 i i i,再从 i i i i − 1 i-1 i1
其中, f [ n ] = 1 f[n]=1 f[n]=1,若 i &lt; = k i&lt;=k i<=k f [ i ] = 1 f[i]=1 f[i]=1
答案就是 ∑ i = 1 c n t f [ i ] \sum_{i=1}^{cnt}f[i] i=1cntf[i]

代码:

// luogu-judger-enable-o2
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#define LL long long

const int maxn=1e5+7;
const LL mod=100003;

using namespace std;

int n,k,cnt;
int a[maxn];
LL f[maxn],ans;

vector <int> p[maxn];

LL ksm(LL x,LL y)
{
    if (y==1) return x;
    LL c=ksm(x,y/2);
    c=c*c%mod;
    if (y&1) c=c*x%mod;
    return c;
}

int main()
{
    scanf("%d%d",&n,&k);
    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    for (int i=1;i<=n;i++)
    {
        for (int j=i;j<=n;j+=i)
        {
            p[j].push_back(i);
        }
    }
    for (int i=n;i>0;i--)
    {
        if (a[i])
        {
            cnt++;
            for (int j=0;j<p[i].size();j++) a[p[i][j]]^=1;
        }
    }
    f[n]=1;
    for (int i=n-1;i>0;i--)
    {
        f[i]=(f[i+1]*(LL)(n-i)+(LL)n)%mod*ksm(i,mod-2)%mod;
    }
    if (cnt<=k) ans=cnt;
    else
    {
        for (int i=k+1;i<=cnt;i++) ans=(ans+f[i])%mod;
        ans=(ans+k)%mod;
    }
    for (int i=1;i<=n;i++) ans=ans*(LL)i%mod;
    printf("%lld\n",ans);
}
CCF大数据与计算智能大赛-面向电信行业存量用户的智能套餐个性化匹配模型联通赛-复赛第二名-【多分类,embedding】.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值