Candy Distribution

Kids like candies, so much that they start beating each other if the candies are not fairly distributed. So on your next party, you better start thinking before you buy the candies.

If there are KK kids, we of course need KXK⋅X candies for a fair distribution, where XX is a positive natural number. But we learned that always at least one kid looses one candy, so better be prepared with exactly one spare candy, resulting in (KX)+1(K⋅X)+1 candies.

Usually, the candies are packed into bags with a fixed number of candies CC. We will buy some of these bags so that the above constraints are fulfilled.

Input

The first line gives the number of test cases tt (0<t<1000<t<100). Each test case is specified by two integers KK and CC on a single line, where KK is the number of kids and CC the number of candies in one bag (1K,C1091≤K,C≤109). As you money is limited, you will never buy more than 109109 candy bags.

Output

For each test case, print one line. If there is no such number of candy bugs to fulfill the above constraints, print “IMPOSSIBLE” instead. Otherwise print the number of candy bags, you want to buy. If there is more than one solution, any will do.

Sample Input 1Sample Output 1
5
10 5
10 7
1337 23
123454321 42
999999937 142857133
IMPOSSIBLE
3
872
14696943
166666655

 

题解:就是求一个不定方程 k*x-c*y=1  有几个注意的地方 对c==1的情况进行特判  不能有puts输出 还有就是不能有(x%d+d)%d来更新x

#include<iostream>
#include<cstring>
#include<cstdio> 
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,x,y);
    ll t=y;
    y=x-(a/b)*y;
    x=t;
    return r;
}
int main(){
    ios::sync_with_stdio(false);
    ll t;
    cin>>t;
    while(t--){
        ll k,c;
        cin>>k>>c;
        ll x,y;
        ll r=exgcd(c,k,x,y);
        if(r!=1){
//            puts("IMPOSSIBLE");
            cout<<"IMPOSSIBLE"<<'\n';
        }
        else {
            if(c==1) {
                cout<<k+1<<'\n';
            }
            else{
                while(x<=0) x+=k;
                cout<<x<<'\n';
            }
        }
    }
    return 0; 
}   

 

 

转载于:https://www.cnblogs.com/Accepting/p/11355352.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值