@xzyxzy
2018-07-03T12:01:29.000000Z
字数 1684
阅读 1893
数学
可以看作加上对式子没有影响,那么的时候就加(最小公倍数)就好了
最终
孙子算经:今有物不知其数,三三数之余二,无物数之余三,七七数之余二,问物几何?
可以处理这种同余方程
也可以处理任意模数NTT
注意我的代码和网上绝大部分博主的不一样
大部分人是把同余方程拆开,像数学一本通上面做的那样
而我的就是在模拟上面说的过程
其中调试了很久,原因在于我的乘法可能会乘爆
加上函数就好啦(我也不知道为什么,哪位dalao可以告诉我原理>_<)
//COGS1786 韩信点兵#include<iostream>#include<cstdio>#include<cstdlib>#define ll long longusing namespace std;ll N,m,P[11],a[11];ll mul(ll x,ll y,ll m){x%=m;y%=m;return (x*y-(ll)((long double)x/m*y+0.5)*m+m)%m;}void Exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=a;y=0;return;}Exgcd(b,a%b,y,x);y-=a/b*x;}void CRT(){ll x,y,c;for(int i=2;i<=m;i++){Exgcd(P[i-1],-P[i],x,y);c=a[i]-a[i-1];P[i]=P[i-1]*P[i];a[i]=((a[i-1]+mul(mul(x,c,P[i]),P[i-1],P[i]))%P[i]+P[i])%P[i];}while(a[m]+P[m]<=N) a[m]+=P[m];if(a[m]>N) puts("-1");else printf("%lld\n",N-a[m]);}int main(){freopen("HanXin.in","r",stdin);freopen("HanXin.out","w",stdout);cin>>N>>m;for(int i=1;i<=m;i++)cin>>P[i]>>a[i];CRT();}