HDU 6063 - RXD and math | 2017 Multi-University Training Contest 3

 比赛时候面向过题队伍数目 打表- -

看了题解发现确实是这么回事,分析能力太差..

/*
HDU 6063 - RXD and math [ 数学,规律 ]  |  2017 Multi-University Training Contest 3
题意:
	求 Σ μ(i)^2 * sqrt( n^k/i ) [ 1 <= i<= n^k ]
	n,k <= 1e18
分析:
	首先 μ(i) 为莫比乌斯函数,若 i 是完全平方数的倍数则 μ(i) = 0 ,否则 μ(i) = ±1
	所以只有不是完全平方数的倍数的数才会对答案产生贡献
	然后任何数都能表示为 x =  a^2*b,即仅为一个非完全平方数的b的平方倍数
	n^k/i 代表 n^k 中 i 的倍数的个数
	则 sqrt(n^k/i) 代表 i 的 平方倍数 的个数
	联系前面的 x =  a^2*b ,可推得相当于每个数都只算了一次
	故答案为 n^k
*/
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const LL MOD = 1e9+7;
LL PowMod(LL a, LL m)
{
    a %= MOD;
    LL ret = 1;
    while (m)
    {
        if (m&1) ret = ret*a%MOD;
        a = a*a % MOD;
        m >>= 1;
    }
    return ret%MOD;
}
int main()
{
    LL n, k;
    int tt = 0;
    while (~scanf("%lld%lld", &n, &k))
    {
        printf("Case #%d: %lld\n", ++tt, PowMod(n, k));
    }
}

 

转载于:https://www.cnblogs.com/nicetomeetu/p/7273658.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值