数论2

题目来源:https://ac.nowcoder.com/acm/contest/5668/F

题意:c/d-e/f=a/b,这里给出a,b,求可行的c,d,e,f(这里要求d与f值小于b)

解题思路:这是一道数论题,需要一定的数学知识去将这个问题转化为我们熟悉的问题。先通分变为(cf-be)/df=a/b,再假设a1/b1为a/b的最简化的分数。具体验证方法如下:图片说明
所以问题转化为一个求b的互质因子问题。再一个大的范围内求出第一个被b整除的质数d,然后求f

#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a , b , sizeof(a))
const int N = 200005;
int prime[N],p;
bool is_prime[N];
 typedef long long ll;
void init()
{
    for(int i=2;i<N;++i)
    {
        if(!is_prime[i]) 
        prime[++p]=i;
        for(int j=1;j<=p&&prime[j]*i<N;++j)
        {
            is_prime[prime[j]*i]=1;
            if(i%prime[j]==0) break;
        }
    }
}

ll gcd(ll a, ll b)
{
    return b == 0 ? a : gcd(b, a % b);  
}

ll gcd1(ll a, ll b, ll &x, ll &y)
{
    ll res, t;
    if(!b)
    {
        x = 1;
        y = 0;
        return a;
    }
    res = gcd1(b, a % b, x, y);
    t = x;
    x = y;
    y = t - (a / b) * y;
    return res;
}

ll solve_ex_gcd(ll a, ll b, ll c, ll &x, ll &y)
{
    ll inv = gcd1(a, b, x, y);
    if(c % inv)
    {
        x = -1;
        y = -1;
        return -1;
    }
    x *= (c / inv);
    y *= (c / inv);
    return 0;
}


void solve()
{
    ll a, b;
    cin >> a >> b;
    ll k = gcd(a, b);
    if(k != 1)
    {
        a /= k;b /= k;
       cout<<a+1<<1<<b<<1<<endl;
        return ;
    }

    if(b == 1 || is_prime[b]==0) 
    puts("-1 -1 -1 -1");
    else             
    {
        ll tmp = 0, time = 0;                
        ll bb = b;
        for(int i = 1;i <= p && bb != 1; i++)  //找两个质因数。 
        {
            if(bb % prime[i] == 0)
            {
                tmp=prime[i];
                while(bb % prime[i] == 0) 
                time++,bb /= prime[i];
                break;
            }
        }

        if(bb == 1)
        {puts("-1 -1 -1 -1");return ;}
        ll d = 1;
        for(int i = 1;i <= time; i++) d *= tmp;
        ll f = bb;
        ll c = 0, e = 0;
        solve_ex_gcd(f, d, a, c, e);
        if(c < 0 && e > 0) 
        cout << e << " " << f << " " << -c << " " << d << endl;
        else 
        cout << c << " " << d << " " << -e << " " << f << endl;
    }
}

int main()
{
    init();
    int q;
    cin>>q;
    while(q--) 
    solve();
}
全部评论

相关推荐

02-12 20:22
重庆大学 Java
字节暑期刚入职四天,因为是年前,所以很多正职都放假走了,也就没有给我分配mt,然后有一个老哥在我来的时候给我发了一个landing手册,然后还有关于部门业务的白皮书,还有一些业务代码。然后本人是java面的,进来第一次接触go语言&nbsp;前面几天熟悉了一下go的语法和go的框架,可以读但是还不太会写,然后业务白皮书也看的很头疼,包括landing手册里要了解的很多东西说实话我看文档真的快看死了,一个嵌套一个,问题是我还完全不知道咋用这个我了解的东西,还有就是那个项目代码,那个老哥喊我去写写单测,熟悉一下go的语法,但也进行的很困难(这是我第一段实习,之前都是springboot那一套,真不太熟悉这个)想问问大家的建议,就是我从现在开始到在开年回来之前应该做些什么,我目前就一个想法&nbsp;就是复现一个landing手册上的go框架小项目&nbsp;就是相当于帮自己锻炼锻炼怎么写go&nbsp;或者各位大佬有没有更好的锻炼go语法的建议还有就是大家都在说vibe&nbsp;coding,那我应该怎么锻炼自己使用ai的能力,感觉我除了给一些需求然后它给我生成代码,好像就没别的用法了,那些什么工作流、拆解、skill啥的都不知道从哪一个地方开始,包括我现在正在实习,不知道精力该怎么分配,去网上想找找关于agent开发的一些学习流程,说实话,众说纷纭,有的是从python开始打基础然后系统学那些rag&nbsp;prompt&nbsp;langchain&nbsp;mcp等等,有的是说直接找一个github上的ai项目然后反复问ai,我确实有点迷茫,恳求各位大佬能留下你们宝贵的建议,我一定认真反复深刻学习有一说一&nbsp;我觉得字节饭挺好吃的!
Jasonnnnnn...:直接把项目代码喂给AI然后让它帮你分析,如果组里已经有一些流程图总结的话最好,没有的话自己画一个 Go的话其实只要把基础语法搞明白就行了,项目里很多都是直接让ai帮你写好然后自己稍微改下,不用学的特别深 ai的话,可以自己写一些md文件来搞点小东西,但除非你打算转算法,否则不用把rag langchain学的特别深,了解下就行了
字节跳动公司福利 1371人发布
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务