荒岛野人bzoj1407
暴力枚举山洞数,再n^2两两判断是否成立
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include<queue> const int maxn=1000000; using namespace std; typedef long long ll; inline int read(){ int x=0,f=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1; for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+ch-'0'; return x*f; } int n,c[20],p[20],l[20],st; ll exgcd(int a,int b,int &x,int &y){ if (b==0){x=1,y=0;return a;} int z=exgcd(b,a%b,x,y),t=x; x=y,y=t-a/b*y;return z; } bool check(int k){ for(int i=1;i<n;i++){ for(int j=i+1;j<=n;j++){ int W=c[j]-c[i],Z=p[i]-p[j]; int d,x,y; d=exgcd(Z,k,x,y); if(W%d)continue; x=(x*W/d)%(k/d); if(x<0)x+=abs(k/d); if(x<=l[i] && x<=l[j])return 0; } } return 1; } int main(){ n=read(); for(int i=1;i<=n;i++)scanf("%d%d%d",&c[i],&p[i],&l[i]),st=max(st,c[i]); for(int i=st;i<=1000000;i++){ if(check(i)){printf("%d",i);break;} } return 0; }
#10216. 「一本通 6.4 练习 2」五指山
裸地crt
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #define ll long long using namespace std; const int maxn=100000+10101; inline int read(){ int x=0,f=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1; for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+ch-'0'; return x*f; } void exgcd(int a,int b,int &d,ll &x,ll &y){ if(b==0){ d=a; x=1;y=0; return ; } exgcd(b,a%b,d,x,y); ll t=x;x=y; y=t-a/b*y; return ; } int t; int main(){ t=read(); for(int i=1;i<=t;i++){ int n=read(),d=read(),x=read(),y=read(); y=y-x; int gcd; ll x1,y1; exgcd(d,n,gcd,x1,y1); if(y%gcd){printf("Impossible\n");continue;} x1=((x1*(y/gcd))%(n/gcd)+n/gcd)%(n/gcd); printf("%lld\n",x1); } return 0; }
Biorhythms poj1006
因为23,28,33互质,所以用crt就行了
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #define ll long long using namespace std; const int maxn=1000000+10101; inline int read(){ int x=0,f=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1; for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+ch-'0'; return x*f; } int d; int m[3]={23,28,33},r[3],M=21252; void exgcd(int a,int b,int &x,int &y){ if(!b){ x=1;y=0; return ; } exgcd(b,a%b,x,y); int t=x;x=y; y=t-a/b*y; return ; } int main(){ int cnt=0; while(1){ r[0]=read();r[1]=read();r[2]=read();d=read(); if(d==r[0] && r[0]==r[1] && r[1]==r[2] && d==-1)break; cnt++; int ans=0; for(int i=0;i<3;i++){ int ww=M/m[i]; int x,y; exgcd(ww,m[i],x,y); ans=((ans+r[i]*ww*x)%M+M)%M; } if(ans<=d)ans+=M; printf("Case %d: the next triple peak occurs in %d days.\n",cnt,ans-d); } return 0; }
C Looooops poj2115
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #define ll long long using namespace std; const int maxn=1000000+10101; inline ll read(){ ll x=0,f=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1; for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+ch-'0'; return x*f; } ll A,B,C,K; ll d,x,y; void exgcd(ll a,ll b,ll &d,ll &x,ll &y){ if(!b){ d=a;x=1;y=0; return ; } exgcd(b,a%b,d,x,y); ll t=x;x=y; y=t-a/b*y; return ; } int main(){ while(1){ A=read();B=read();C=read();K=read(); if(A==0 && B==0 && C==0 && K==0)break; ll sum=(1ll<<K); B=((B-A)%sum+sum)%sum; exgcd(C,sum,d,x,y); if(B%d==0){ sum=sum/d; x=((x*B/d)%sum+sum)%sum; printf("%lld\n",x); } else printf("FOREVER\n"); } return 0; }