hdu2197枚举约数

http://acm.hdu.edu.cn/showproblem.php?pid=2197

这题从反面考虑更简单一些,即考虑非本原串的个数

总的串个数是2^n个,原串如果由k个相同的串组成,则就不是本源串了,那么可以想到,k是n的约数才满足,当然这里有特殊情况

即全1和全0两种

相当于记忆化搜索进行枚举因数的可能结果,再把所有结果加到一起

题中n最大为1e8  它的因子数最多就为1e4*2 所以直接开个map就行

#include
using namespace std;
typedef long long ll;
const int N = 1e6+100;
const int INF = 0x3f3f3f3f;
const int mod = 2008;
map dp;
ll n;
ll qp(ll a,ll b)
{
    ll ans = 1;
    while(b){
        if(b&1) ans = ans * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return ans;
}
ll fun(ll k)
{
    if(dp[k]) return dp[k];
    ll s = 2;
    for(int i = 2;i * i <= k;i ++){
        if(k % i == 0){
            s += fun(i);
            if(i * i != k) s += fun(k/i);
        }
        s %= mod;
    }
    return dp[k] = (qp(2,k)-s+mod)%mod;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    dp[1] = dp[2] = 2;
    while(cin >> n){
        cout << fun(n) << '\n';
    }
    return 0;
}

 

你可能感兴趣的:(HDU,数论)