HDU 6189 - Law of Commutation ( 规律 + 思路 )

原创 2018年04月15日 18:39:57

题意

给出n, a ( n ≤ 30, 1 ≤ a ≤ 109. ), m = 2^n, 求[1, m]范围内有多少个数b使得 a^b mod m == b^a mod m

思路

打表找规律
1. 若a为奇数 cnt == 1
2. 若a为偶数 :
当 b <= n 时, 因为数据量较小可以直接暴力求
当 b > n 时, a^b % m 必然 = 0 要求有b使得 b^a % m = 0, 所以b必然为偶数
具体实现见代码

传说中的官方题解

I Law of Commutation
对于a为奇数的情况,b一定为奇数,下证b=a mod 2^n。
由于奇数平方模8余1,故a^b=a mod 8, b^a=b mod 8
故a=b mod 8
由于奇数四次方模16余1,故a^b=a^(b%4) mod 16, b^a=b^(a%4) mod 16
由于b%4=a%4,故a=b mod 16
以此类推,得b=a mod 2^n。解唯一(当然打表可以看出来,现场一堆打表过的)
对于a为偶数的情况,b一定为偶数。
若b≥n,则a^b=0 mod 2^n,故b^a=0 mod 2^n。
可直接求出b≥n时的个数。
若b<n,则直接暴力,时间复杂度O(nloga)。

参考链接:
HDU - 6189 Law of Commutation(找规律+推公式 17广西邀请赛题)
HDU 6189 Law of Commutation 2017ACM-ICPC 广西邀请赛 (打表找规律)

AC代码

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
typedef unsigned long long ll;
const long long mpd = 1e9+7;
ll m;

ll quickmi( ll a, ll b ){
    ll ans = 1;
    while(b){
        if(b&1) ans = (a*ans) % m;
        b >>= 1;
        a = (a*a) % m;
    }
    return ans;
}

ll qmi( ll a, ll b ){
    ll ans = 1;
    while(b){
        if(b&1) ans = a*ans;
        b >>= 1;
        a = a*a;
    }
    return ans;
}

int main()
{
    ll n, a;
    while( ~scanf("%llu%llu",&n, &a) ){
        if( a % 2 != 0 )
            puts("1");
        else{
            m = 1 << n;
            ll cnt = 0;
            for( ll i = 1; i <= n; i++ ){
                ll amod = quickmi(a, i) % m;
                ll bmod = quickmi(i, a) % m;
                if( amod == bmod )
                    cnt++;
            }
            ll temp = n / a;
            if( temp*a < n ) temp += 1;
            ll tmp = qmi(2, temp);
            cnt += m/tmp - n/tmp;
            printf("%llu\n",cnt);
        }
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JinxiSui/article/details/79951719

HDU - 6189 Law of Commutation(找规律+推公式 17广西邀请赛题)

As we all know, operation ''+'' complies with the commutative law. That is, if we arbitrarily select...
  • hyesuixin
  • hyesuixin
  • 2017-09-05 20:46:14
  • 481

解题报告:HDU_6189 Law of Commutation (找规律)

题目链接 题意: 给定n,a,求区间 [ 1 , 1的个数 思路: 打表发现以下规律 1、若a为奇数,答案为1 2、若a为偶数,则对于大于n的b,满足,其中a2,b2为...
  • qq_32570675
  • qq_32570675
  • 2017-09-04 16:10:24
  • 254

hdu6189 Law of Commutation 2017ACM-ICPC全国邀请赛(广西) 找规律

hdu6189 Law of Commutation 2017ACM-ICPC全国邀请赛(广西) 找规律
  • axuhongbo
  • axuhongbo
  • 2017-09-03 15:07:40
  • 531

Law of Commutation HDU - 6189

Law of Commutation  HDU - 6189 As we all know, operation ''+'' complies with the commutative law. ...
  • qq_39482280
  • qq_39482280
  • 2017-09-05 19:31:15
  • 87

HDU 6189 Law of Commutation(数论)

Description 给出两正整数a,na,na,n,令m=2nm=2nm=2^n,对于任意b∈[1,m]b∈[1,m]b\in [1,m],求满足ab≡ba(mod&amp;nbsp;m)ab≡...
  • V5ZSQ
  • V5ZSQ
  • 2018-02-14 12:50:39
  • 96

HDU 6189 Law of Commutation 2017ACM-ICPC 广西邀请赛 (打表找规律)

As we all know, operation ''+'' complies with the commutative law. That is, if we arbitrarily select...
  • qq_38538733
  • qq_38538733
  • 2017-09-05 21:01:13
  • 376

hdu 6189 a^b%m=b^a%m

传送门 题意: 给定n,a,求区间 [ 1 , 1的个数 首先打表的话可以很容易找到一个规律:a为奇数时,答案肯定为1,这个规律很容易看出,详细解释一下a为偶数时怎么算,m一...
  • qq_36553623
  • qq_36553623
  • 2017-09-07 21:53:35
  • 244

HDU 6189 number number number

number number number                 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/...
  • qq_39259536
  • qq_39259536
  • 2017-09-11 21:30:15
  • 60

幂次法则power law

幂次法则分布和高斯分布是两种广泛存在的数学分布。可以预测和统计相关数据。 pig中用其处理数据倾斜,实现负载均衡。 个体的规模和其名次之间存在着幂次方的反比关系,R(x)=ax(-b次方)...
  • longshenlmj
  • longshenlmj
  • 2014-08-06 16:12:16
  • 1825

HDU 2620 Ice Rain(取模运算规律)

计算方法参考了http://blog.csdn.net/racebug2010/article/details/6090801 这里比较有意思的小技巧是算出和i计算k/i结果相同的最大的j值 d=k/...
  • z690933166
  • z690933166
  • 2013-08-18 15:43:33
  • 647
收藏助手
不良信息举报
您举报文章:HDU 6189 - Law of Commutation ( 规律 + 思路 )
举报原因:
原因补充:

(最多只允许输入30个字)