其他分享
首页 > 其他分享> > Creating Multiples(逆元+同余定理)没有解决

Creating Multiples(逆元+同余定理)没有解决

作者:互联网

b进制数最多使某一位减小使得新数是b+1的乘积,不能减输出-1,不用减输出0,否则输出减小的位的下标和减小后的新位。
View problem

思路: 就是更具题意转化为同于定理(把N当成整体来看,枚举的位次一次增加)(中间有除法利用逆元ksn,mod-2)

同余定理   2个数的余数相同(%以同一个数)那么这2个数相减%这个数=0;(被整除)

代码: 答案错误 在第11个点, 求大佬看看,调了很多个版本都是这样。

             n ≡ m ( m o d b + 1 )    ⟺    n − m ≡ 0 ( m o d b + 1 ) 

#include <bits/stdc++.h>
using namespace std;
#define ri register int
#define M 200015

template <class G> void read(G &x)
{
    x=0;int f=0;char ch=getchar();
    while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return ;
}

long long  n,m;
long long  mod;
long long  p[M],aa[M],inv[M];
long long ksn(long long a,long long n)
{
    long long ans=1;
    while(n)
    {
        if(n&1) ans=ans*a%mod;
        n>>=1;a=a*a%mod;
    }
    return ans;
}
int main(){
    
    read(m);read(n);
    mod=m+1;
    for(ri i=1;i<=n;i++)
    {
        read(p[i]);
    }

    long long tmp=0;
    aa[0]=1;
    for(ri i=1;i<=n;i++) 
    {
        aa[i]=aa[i-1]*m%mod;
        tmp=(tmp+(p[n-i+1]*aa[i-1])%mod)%mod; // 要取余数时看是不是所有地方都取了 
    }
    if(tmp==0) 
    {
        printf("0 0");
        return 0;
    }
    
    for(ri i=1;i<=mod;i++)
    {
        inv[i]=ksn(i,mod-2);
    }
    
    for(ri i=1;i<=n;i++)
    {
        long long t=tmp*inv[aa[n-i]]%mod;
        if(t<=p[i])
        {
            printf("%d %lld",i,p[i]-t);
            return 0;
        }
    }
    printf("-1 -1");
    return 0;
} 
View Code

 

标签:ch,Creating,int,定理,read,while,逆元,Multiples,mod
来源: https://www.cnblogs.com/Lamboofhome/p/16161102.html