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