标签:ch Creating int 定理 read while 逆元 Multiples mod
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。