Codeforces 724C Ray Tracing 扩展欧几里得
生活随笔
收集整理的這篇文章主要介紹了
Codeforces 724C Ray Tracing 扩展欧几里得
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
吐槽:在比賽的時候,壓根就沒想到這題還可以對稱;
題解:http://blog.csdn.net/danliwoo/article/details/52761839
比較詳細;
#include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<algorithm> #include<iomanip> #include<map> #include<set> #include<vector> #include<ctime> #include<cmath> #define LL long long using namespace std; #define LL long long #define up(i,j,n) for(int i=(j);(i)<=(n);(i)++) #define max(x,y) ((x)<(y)?(y):(x)) #define min(x,y) ((x)<(y)?(x):(y)) #define FILE "1" const int maxn=101000; const LL inf=10000000000000LL; int n,m,k; void init(){scanf("%d%d%d",&n,&m,&k); } void gcd(LL a,LL b,LL &d,LL &x,LL &y){if(b==0){d=a;x=1;y=0;return;}gcd(b,a%b,d,x,y);int t=x;x=y;y=t-a/b*x;return; } LL t(LL a,LL b,LL c,LL &x,LL &y ){LL d;gcd(a,b,d,x,y);if(c%d)return -1;LL ran=b/d;if(ran<0)ran=-ran;x*=c/d;x=(x%ran+ran)%ran;return 0; } LL get(LL x,LL y,LL maxx){LL K,S;if(t(2*n,-2*m,y-x,K,S)==-1)return maxx+1;LL ans=2*K*n+x;if(ans<0||ans>maxx)return maxx+1;return ans; } LL gcd(LL a,LL b){return b?gcd(b,a%b):a;} LL work(LL x,LL y){LL maxx=1LL*n/gcd(n,m)*m;LL minn=maxx+1;minn=min(get(x,y,maxx),minn);minn=min(get(-x,y,maxx),minn);minn=min(get(x,-y,maxx),minn);minn=min(get(-x,-y,maxx),minn);if(minn==maxx+1)return -1;else return minn; } void slove(){init();up(i,1,k){LL x,y;scanf("%I64d%I64d",&x,&y);printf("%I64d\n",work(x,y));} } int main(){slove(); } View Code?
轉載于:https://www.cnblogs.com/chadinblog/p/5943097.html
總結
以上是生活随笔為你收集整理的Codeforces 724C Ray Tracing 扩展欧几里得的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现Unicode和汉字的相互转换
- 下一篇: 关于如何将sublime的主题应用到we