青蛙的约会
题意:
给定青蛙A,B的初始位置x,y,和速度n,m,然后说地球的某一纬度中,周长为L。
然后就有同余方程
(x+nt)≡(y+mt) (mod L)
然后求解即可。记得是最小正整数x。
#include<stdio.h>
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll &x ,ll &y){
if(b==0){
x=1;y=0;
return a;
}
ll r=exgcd(b,a%b,y,x);
y=y-a/b*x;
return r;
}
int main()
{
ll x,y,n,m,L,A,B,C,Gcd,t;
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&L);
A=m-n;
B=L;
C=y-x;
Gcd=exgcd(A,B,x,y);
if(C%Gcd){
printf("Impossible\n");
}else{
t=C/Gcd;
x=x*t;
t=B/Gcd;
t=t>0?t:-t;
x=(x%t+t)%t;
printf("%lld\n",x);
}
return 0;
}
C Looooops
题意:
A+CX≡B(Mod 2^k)
记得这个也需要最小正整数解。
#include<stdio.h>
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1;y=0;return a;
}
ll r=exgcd(b,a%b,y,x);
y=y-a/b*x;
return r;
}
int main()
{
ll a,b,c,k,x,y,A,B,C,r,t;
while(~scanf("%lld%lld%lld%lld",&A,&B,&C,&k)){
if(!A&&!B&&!C&&!k) return 0;
a=C,b=1ll<<k,c=B-A;
r=exgcd(a,b,x,y);
if(c%r){
printf("FOREVER\n");
}else{
t=c/r;
x=x*t;
t=b/r;
t=t<0?-t:t;
x=(x%t+t)%t;
printf("%lld\n",x);
}
}
return 0;
}
A/B
题意:
简单明了,就是求解
A*inv(B) (mod 9973)
我写了三种方法来求解逆元。
#include<stdio.h>
using namespace std;
typedef long long ll;
const ll mod=9973;
ll exgcd(ll a,ll b,ll &x,ll &y){
if( b==0 ){
x=1;y=0;
return a;
}
ll r=exgcd(b,a%b,y,x);
y=y-a/b*x;
return r;
}
ll qpow(ll a,ll b){
ll ans=1;
while(b){
if(b&1) ans=ans*a%mod;
b>>=1; a=a*a%mod;
}return ans;
}
ll inv_(ll a){
ll r=qpow(a,mod-2);
return r;
}
ll inv__(ll a){
ll x,y,b=mod,r,t;
r=exgcd(a,b,x,y);
x=(x%mod+mod)%mod;
return x;
}
ll inv___(ll a,ll p){
a%=p;
return a==1||a==0?1:(p-p/a)*inv___(p%a,p)%p;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
ll a,b,ans;
scanf("%lld%lld",&a,&b);
ans=a*inv___(b,mod)%mod;
printf("%lld\n",ans);
}
}
Romantic
题意:
给你A,B,然后求解Ax+By=1,然后这个x必须是最小的正整数。
套板子,然后注意是求最小正整数即可。然后就是把y求解出来即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1;y=0; return a;
}
ll r=exgcd(b,a%b,y,x);
y=y-a/b*x;
return r;
}
int main(){
ll a,b,c,x,y,gcd,t;
while(~scanf("%lld%lld",&a,&b)){
gcd=exgcd(a,b,x,y);
if(gcd!=1) printf("sorry\n");
else {
t=b;
x=(x%t+t)%t;
y=(1-a*x)/b;
printf("%lld %lld\n",x,y);
}
}
return 0;
}
How do you add?
题解:
给你n,k.就是说,你可以选择[0,n]的所有数字,任意k个加起来等于n
这个题一直没有什么思路,本来想搜题解的,然后看到了三个字,我就知道怎么做了。
就是“隔板法”三个字。
这种情况是 框里放小球,框可以为空。
然后这个题目,就可以直接把杨辉三角打出来了。
然后就算出来了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e2+100;
const int mod=1000000;
ll c[N][N];
void init(){
c[0][0]=1;
for(int i=1;i<N;i++){
c[i][0]=c[i][i]=1;
for(int j=1;j<i;j++){
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
}
/*
for(int i=0;i<=22;i++){
for(int j=0;j<=i;j++){
printf("%lld ",c[i][j]);
}
puts("");
}
*/
}
int main()
{
init();
ll n,k,ans;
while(~scanf("%lld%lld",&n,&k)){
if(!n&&!k) break;
ans=c[n+k-1][k-1];
printf("%lld\n",ans);
}
return 0;
}