码迷,mamicode.com
首页 > 其他好文 > 详细

2015 HDU 多校联赛 5363 Key Set

时间:2015-08-07 01:51:15      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:2015多校联赛   分治   


2015 HDU 多校联赛 5363 Key Set


题目: http://acm.hdu.edu.cn/showproblem.php?pid=5363


根据前面给出的例子,得出求解公式 fn = 2^(n-1) - 1, 数据量大,实际就是求幂次方。 

可用分治法求解,复杂度O(nlogn)


// 分治法求快速幂

#include <bits/stdc++.h>

using namespace std;

typedef unsigned long long ull;

const int MOD = 1000000007;

ull getAns(ull a, int n)
{
    if (n==0)
        return 1;
    if (n==1)
        return a;
    else
    {
        a %= MOD;
        ull res = a*a;
        res %= MOD;

        if (n%2 == 0)
        {
            return getAns(res, n/2)%MOD;
        }
        else
        {
            return (getAns(res, n/2)*a)%MOD;
        }
    }
}

int main(void)
{
    //freopen("in.txt", "r", stdin);

    int t = 0;
    scanf("%d", &t);
    ull a = 2;
    while(t--)
    {
        int n = 0;
        scanf("%d", &n);
        printf("%lld\n", getAns(a, n-1)-1);     // 2^(n-1) - 1
    }

    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/core__code

2015 HDU 多校联赛 5363 Key Set

标签:2015多校联赛   分治   

原文地址:http://blog.csdn.net/core__code/article/details/47326625

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!