Prime Number(CodeForces-359C)[快速幂/思维]

题意:已知X,数组arr[n],求一个分式的分子与分母的最大公因数。分子为ΣX^arr[i],分母为X^Σarr[i],数组为不递减序列。

思路:比赛的时候以为想出了正确思路,WA掉了很多发,看了别人写的代码才发现自己漏掉很多细节。

  1.容易想到,分子的最低次幂即可能为所需答案

  2.由于arr里存在相同的数,因此分子的各个幂存在可以合并同类项的情况,所以应该先彻底完成合并同类项,再进行步骤1。

  3.一个小技巧,并不需要完成所有项的合并,当且仅当当前最小项的系数可以被X整除时才需要继续合并,否则当前项的次数即为答案所需次数。

特别需要注意的是:完成合并后,分子的最低次幂的次数是有可能大于分母的次数的,所以应该取二者的较小值作为答案的次数。

代码如下:

#include<cstdio>
#include<iostream>
using namespace std;
const int mo=1e9+7;
int x;
int mpow(long long xx,long long nn){
    long long res=1;
    while(nn!=0){
        if(nn&1){
            res=res*xx%mo;
        }
        nn>>=1;
        xx=xx*xx%mo;
    }
    return res;
}

int main(){
    int n;
    long long num=0,arr[100010];
    scanf("%d%d",&n,&x);
    for(int i=1;i<=n;i++){
        scanf("%I64d",&arr[i]);
        num+=arr[i];
    }
    for(int i=1;i<=n;i++){
        arr[i]=num-arr[i];
    }
    for(int i=1;i<=(n/2);i++){
        swap(arr[i],arr[n-i+1]);
    }
    int sum=1;
    long long ans;
    arr[n+1]=-1;
    for(int i=2;i<=n+1;i++){
        if(arr[i]==arr[i-1]){
            sum++;
        }
        else {
            if(sum%x==0){
                sum/=x;
                arr[--i]++;
            }
            else {
                ans=arr[i-1];
                break;
            }
        }
    }
    ans=min(ans,num);
    printf("%d",mpow(x,ans));
    return 0;
}

By xxmlala

原文地址:https://www.cnblogs.com/xxmlala-fff/p/11622006.html

时间: 2024-08-05 17:04:28

Prime Number(CodeForces-359C)[快速幂/思维]的相关文章

uva 11651 - Krypton Number System(矩阵快速幂)

题目链接:uva 11651 - Krypton Number System 题目大意:给定进制base,和分数score,求在base进制下,有多少个数的值为score,要求不能有连续相同的数字以及前导0.计算一个数的值即为相邻两位数的平方差和. 解题思路:因为score很大,所以直接dp肯定超时,但是即使对于base=6的情况,每次新添一个数score最大增加25(0-5),所以用dp[i][j]预处理出base平方以内的总数,然后用矩阵快速幂计算. #include <cstdio> #

Uva10689 Yet another Number Sequence ( 矩阵快速幂 )

Uva 10689Yet another Number Sequence(  矩阵快速幂  ) 题意: 就是矩阵快速幂,没什么好说的. 分析: 其实还是斐波那契数列.只是最后对应的矩阵不是(1,1)是(a,b)了 MOD = 1; for( int i = 0; i < m; ++i ) MOD *= 10; 代码 #include <cstdio> #include <cstring> #include <algorithm> using namespace s

hdu-2685 I won&#39;t tell you this is about number theory---gcd和快速幂的性质

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2685 题目大意: 求gcd(am-1,an-1)%k 解题思路: 对于am-1 = (a - 1) * (1 + a + a2 + ... + am-1) 所以最开始的gcd就为a-1 对于两个1 + a + a2 + ... + am-1和1 + a + a2 + ... + an-1来说,可以找出gcd(m, n)那么久就可以提出gcd 比如: 1 + a + a2 + a3 1 + a + 

UVA - 10689 Yet another Number Sequence 矩阵快速幂

                  Yet another Number Sequence Let’s de?ne another number sequence, given by the following function:f(0) = af(1) = bf(n) = f(n − 1) + f(n − 2), n > 1When a = 0 and b = 1, this sequence gives the Fibonacci Sequence. Changing the values

zoj3690--Choosing number(dp,矩阵快速幂)

Choosing number Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Description There are n people standing in a row. And There are m numbers, 1.2...m. Every one should choose a number. But if two persons standing

HDU 1005 Number Sequence 矩阵快速幂

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 236241    Accepted Submission(s): 60070 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A

CodeForces 185A 快速幂

一开始找矩阵快速幂的题来做时就看到了这题,题意就是让你求出如图所示的第n个三角形中指向向上的小三角形个数.从图中已经很容易看出递推关系了,我们以f[n]表示第n个大三角形中upward的小三角形个数,g[n]表示第n个大三角形中downward的小三角形个数,然后,递推关系就是: f[n]= 3*f[n-1]+1*g[n-1]; g[n]= 3*g[n-1]+1*f[n-1]; 其中f[0]=1,g[0]=0(一开始的纯三角形是从n=0开始的),然后……就没有然后了,直觉上感觉f[n]很难表示成

SDUT1607:Number Sequence(矩阵快速幂)

题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1607 题目描述 A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the value of f(n). 输入

ZOJ 3690 Choosing number(矩阵快速幂)

题目地址:ZOJ 3690 假设F(n)表示前n个人第n个人选择的数大于k的个数,G(n)表示的是前n个人第n个人选择的数小于等于k的个数 那么F(n) = F(n-1)*(m-k)+G(n-1)*(m-k) , G(n) = F(n-1)*k+G(n-1)*(k-1) , 那么最后的结果就是F(n)+G(n); 那么我们可以构造出矩阵 | m-k m-k|   | F(n-1) |       | F(n) | | k      k-1| * | G(n-1) | => | G(n) | 那么