【快速幂+中等难度】Calculation 哈工大HITOJ2901

这些天好颓啊。。都没有A题,只是各种等着填的坑。。简直、、

这道题。。。。其实是快速幂模板题。。为了学习矩阵快速幂,顺手复习下快速幂。。。

哈工大的OJ其实还挺友好的。速度也快。。赞一个。。

翻译

给你两个数A,B,要你求(1b + 2b + ... + ab) 这个式子mod a的结果。(b是奇数)

每行一组数据

(我以下的代码和解释都是用大写的A,B来代替原题小写a,b,代码中的小写a只是一个类似tmp的东西)

原题

http://acm.hit.edu.cn/hoj/problem/view?id=2901

Given two integers a and b, you are to calculate the value of the following expression: (1b + 2b + ... + ab) modulo a.

Note that b is an odd number.

Input specifications

Each line of input consists of two integers a and b (1≤a≤1000000000, 1≤b≤1000000000) respectively.

Output specifications

For each case of input, you should output a single line, containing the value of the expression above.

Sample Input

1 1
2 1

Sample Output

  0

  1

思路

快速幂模板题。

中等难度是因为有一个人类根本YY不出来的优化:(我偷偷看了看题解。。)

根据二项式展开,发现  [ c^b+(a-c)^b ] % a = 0 ,所以有:

若a为奇数,答案为0,若a为偶数,答案为a/2的b次方(快速幂)  还要%a。。

下面给个人类的推导过程:

一定是发现了什么不得了的东西:当我们把第i项和第A-i项的结果相加,刚好会被A整除。。所以。。

只有偶数的一半那个(如上图12的一半6)只有两个自己相加。。而实际上没有两个同样的项,那么我们要输出的就是它的快速幂结果。。

所以:奇数:0,偶数:((A/2)^B)%A;

这样我们成功把复杂度降到了O(n)左右。。(如果出题人太坑也没办法,事实证明没有这么坑)

这里以上的证明都是针对B为奇数的特例,如果B为偶数则以上式子均不适用

(如果A,B均为偶数,则第i项与第A-i+1项的和会呈现对称分布。。(或者说第i项与第A-i项的和们最后一项是0,前面的呈现对称分布),

而若A为奇数,B为偶数,第i项与第A-i(+1)项的和会很奇怪。。我也没找到规律。。)

注意

一个数的奇偶性可以用&1来判断,即若(P&1)==1则表示P为奇数,若(P&1)==0则表示P为偶数

当然,这只是一个优化常数的方法。。如果没有把握还是用%2吧。。

代码

/*http://acm.hit.edu.cn/hoj/problem/view?id=2901*/

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
long long A,B;

inline int read()
{
    long long x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}

struct pointer
{
    long long AA,BB;
};

long long Matrix_multiplication(long long a, long long n)
{
    long long ret = 1;
    while(n)
    {
        if(n&1) ret = (ret*a)%A;
        a = (a*a)%A;
        n >>= 1;
    }
    return ret;
}

int main()
{
    long long times,ans;
    while( cin>>A>>B )
    {
    ans=0;
        if ((A&1)==0)
        {
          ans=Matrix_multiplication(A/2,B);
          ans%=A;
        }
        else
        {
            ans=0;
        }
    cout<<ans<<endl;
}
    return 0;
}

结果

【快速幂+中等难度】Calculation 哈工大HITOJ2901

时间: 2024-11-05 15:57:20

【快速幂+中等难度】Calculation 哈工大HITOJ2901的相关文章

hdu 4965 Fast Matrix Calculation(矩阵快速幂)

题目链接:hdu 4965 Fast Matrix Calculation 题目大意:给定两个矩阵A,B,分别为N*K和K*N: 矩阵C = A*B 矩阵M=CN?N 将矩阵M中的所有元素取模6,得到新矩阵M' 计算矩阵M'中所有元素的和 解题思路:因为矩阵C为N*N的矩阵,N最大为1000,就算用快速幂也超时,但是因为C = A*B, 所以CN?N=ABAB-AB=AC′N?N?1B,C' = B*A, 为K*K的矩阵,K最大为6,完全可以接受. #include <cstdio> #inc

HDU 4965 Fast Matrix Calculation(矩阵快速幂)

HDU 4965 Fast Matrix Calculation 题目链接 矩阵相乘为AxBxAxB...乘nn次,可以变成Ax(BxAxBxA...)xB,中间乘n n - 1次,这样中间的矩阵一个只有6x6,就可以用矩阵快速幂搞了 代码: #include <cstdio> #include <cstring> const int N = 1005; const int M = 10; int n, m; int A[N][M], B[M][N], C[M][M], CC[N]

hdu 4965 Fast Matrix Calculation(矩阵快速幂)2014多校训练第9场

Fast Matrix Calculation                                                                   Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description One day, Alice and Bob felt bored again, Bob knows Ali

HDU 4965 Fast Matrix Calculation (矩阵快速幂取模----矩阵相乘满足结合律)

http://acm.hdu.edu.cn/showproblem.php?pid=4965 利用相乘的可结合性先算B*A,得到6*6的矩阵,利用矩阵快速幂取模即可水过. 1 #include<iostream> 2 #include<stdio.h> 3 #include<iostream> 4 #include<stdio.h> 5 #define N 1010 6 #define M 1010 7 #define K 6 8 using namespa

hdu 2837 Calculation【欧拉函数,快速幂求指数循环节】

欢迎关注__Xiong的博客: http://blog.csdn.net/acmore_xiong?viewmode=list Calculation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1912    Accepted Submission(s): 413 链接:click me Problem Description A

hdu 4965 Fast Matrix Calculation(矩阵快速幂)

题意: 给你一个N*K的矩阵A和一个K*N的矩阵B,设矩阵C=AB,M=C^(N*N),矩阵Mmod6后,所有数的和是多少 思路: 刚开始我是直接计算的,开了一个1000*1000的矩阵,结果直接爆掉了 后来看了看题解,发现想的很巧妙 观察 M=ABABAB....AB,AB每次都是1000*1000,可是BA确是6*6的 那么 M=A(BABABA..BA)B,我们让BA进行矩阵快速幂就不会爆掉了 M=A(BA)^(N*N-1)B,最后计算一下就好了 代码: #include <iostrea

(中等) CF 576D Flights for Regular Customers (#319 Div1 D题),矩阵快速幂。

In the country there are exactly n cities numbered with positive integers from 1 to n. In each city there is an airport is located. Also, there is the only one airline, which makes m flights. Unfortunately, to use them, you need to be a regular custo

hdu 4965 Fast Matrix Calculation【矩阵快速幂模板】

此题只是需要对某个矩阵进行变换相乘之类的,换一下两个矩阵相乘的顺序,利用矩阵快速幂求解即可. #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #define N 1010 using namespace std; const int mod=6; int**

HDU 4686 Arc of Dream 矩阵快速幂,线性同余 难度:1

http://acm.hdu.edu.cn/showproblem.php?pid=4686 当看到n为小于64位整数的数字时,就应该有个感觉,acm范畴内这应该是道矩阵快速幂 Ai,Bi的递推式题目已经给出, Ai*Bi=Ax*Bx*(Ai-1*Bi-1)+Ax*By*Ai-1+Bx*Ay*Bi-1+Ay*By AoD(n)=AoD(n-1)+AiBi 构造向量I{AoD(i-1),Ai*Bi,Ai,Bi,1} 初始向量为I0={0,A0*B0,A0,B0,1} 构造矩阵A{ 1,0,0,0,