题意
给定n,m,求mNmodP。其中,P=999999599,N为将
Time Limits:3000ms
Memory Limits:256M
分析
根据费马小定理,mN=mNmod(P−1),这个可用快速幂算。我们的问题就是如何求Nmod(P−1)。
我们先想O(N2)的算法。因为每个正整数都能使用若干次,那么这就是一个完全背包问题。但是本题中此算法的复杂度显然不可接受。
我们把正整数以N−−√分界。
那么对于小于等于N−−√的正整数,我们直接完全背包,求出用它们组成和为i的方案数,记为
对于大于N−−√的正整数,可以发现,我们最多只会选择N−−√个。记k=N−−√,我们考虑这样一个方程:
设g[i][j]为已经选了i个数,它们的和为
转移:g[i][j]=g[i−1][j−k]+g[i][j−i]
这个方程是什么意思呢?
我们把每个选择的数xi都看成由k加上
这样,我们就同样能以
注意:求f和