高精度取模模板

Posted three-d

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度取模模板相关的知识,希望对你有一定的参考价值。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define ll long long
int turn[105];
struct node
    int num[105];
    friend bool operator <(node a,node b)
        if(a.num[0]^b.num[0])  return a.num[0]<b.num[0];
        for(register int i=a.num[0];i;--i)  if(a.num[i]^b.num[i])  return a.num[i]<b.num[i];
        return 1;
    
    friend node operator -(node a,node b)
        int pos;
        for(register int i=1;i<=a.num[0];++i)
            if(a.num[i]<b.num[i])  a.num[i]+=10,--a.num[i+1];
            a.num[i]-=b.num[i];
        
        while(a.num[0]&&!a.num[ a.num[0] ]) --a.num[0];
        return a;
    
    friend node operator %(node a,node b)
        int cnt=a.num[0]-b.num[0]+1;
        node res;
        for(register int i=cnt;i;--i)
            memset(res.num,0,sizeof(res.num));
            for(register int j=1;j<=b.num[0];++j)  res.num[j+i-1]=b.num[j];
            res.num[0]=b.num[0]+i-1;
            while(res<a) a=a-res;
        
        return a;
    
n,m;
inline void read(node &n)

    int num=0; char ch=getchar();
    while(ch<0||ch>9)  ch=getchar();
    while(ch>=0&&ch<=9)  turn[++num]=(ch^48),ch=getchar();
    n.num[0]=num;
    for(register int i=1;i<=num;++i)  n.num[i]=turn[num-i+1];

void gcd(node a,node b)
    //cout<<a.num[0]<<‘ ‘<<b.num[0]<<‘ ‘<<b.num[1]<<"#"<<endl;
    if(!b.num[0])
        if(a.num[0]==1&&a.num[1]==1) cout<<"Yes"<<endl; return; 
        else  cout<<"No"<<endl; return ; 
    
    if(a<b)  gcd(a,b%a);
    else gcd(b,a%b);

int main()
    
    int t;
    scanf("%d",&t);
    while(t--)
        read(n),read(m);
        //n=n%m;
        //for(register int i=n.num[0];i;--i) cout<<n.num[i];
        gcd(n,m);
    

 

 

以上是关于高精度取模模板的主要内容,如果未能解决你的问题,请参考以下文章

模板快速乘

POJ 1625 Censored!(AC自动机+高精度+dp)

高精度模板

XDOJ 1046 - 高精度模板综合测试 - [高精度模板]

大数高精度运算(模板)

『模板 高精度计算』