小翔题库

· · 个人记录

题单 & 题解

std如下:

自己出的/抄的题。没有质量,没有难度。

std

  1. 皮蛋
#include<bits/stdc++.h>
typedef long long LL;
const int N=1e6+5;
int n,l,tot;LL ans;
struct node{ int x,p; } G[N];
inline bool operator < (node a,node b){ return a.x<b.x; }
signed main(){
    scanf("%d%d",&n,&l);
    for (int i=1;i<=n;++i) scanf("%d%d",&G[i].p,&G[i].x);
    std::sort(G+1,G+1+n);
    for (int i=1;i<=n;++i) G[i].p?++tot:ans+=tot;
    printf("%lld",ans);
    return 0;
}
  1. 毛笋
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,m,k,f[N],ans;
struct node{ int x,y; } G[N];int idx;
inline bool operator < (node a,node b){ return a.x==b.x?a.y<b.y:a.x<b.x; }
signed main(){
    scanf("%d%d%d",&n,&m,&k);
    for (int i=1;i<=k;++i){
        int a,b,c;scanf("%d%d%d",&a,&b,&c);
        if (c>a+b-2) G[++idx]=(node){a,b};
    }
    std::sort(G+1,G+1+idx);
    memset(f,0x3f,sizeof(f)),f[0]=0;
    for (int i=1;i<=idx;++i){
        int now=upper_bound(f,f+2+ans,G[i].y)-f-1;
        ans=max(ans,now+1),f[now+1]=min(f[now+1],G[i].y);
    }
    printf("%d\n%d",n+m-2,ans);
    return 0;
}
  1. 蒜头
#include<cstdio>
#include<cstring>
using namespace std;
const int N=501,M=51,P=290;
int n,m,k,p;
int A[N],B[N],F[N][M][P],ans=-1;
inline void tomax(int& x,const int y){
    if (x<y) x=y;
}
signed main(){
    scanf("%d%d%d%d",&n,&m,&k,&p);
    memset(F,-1,sizeof(F));
    for (int i=1;i<=n;++i) scanf("%d",&A[i]);
    for (int i=1;i<=n;++i) scanf("%d",&B[i]);
    F[1][m][A[1]]=k;
    if (m) F[1][m-1][(A[1]>>1)*(A[1]>>1)%p]=k;
    if (k) tomax(F[1][m][B[1]],k-1);
    for (int i=1;i<n;++i){
        for (int j=0;j<=m;++j){
            for (int h=0;h<p;++h){
                tomax(F[i+1][j][h*A[i+1]%p],F[i][j][h]);
                if (j) tomax(F[i+1][j-1][h*(A[i+1]>>1)*(A[i+1]>>1)%p],F[i][j][h]);
                if (F[i][j][h]) tomax(F[i+1][j][h*B[i+1]%p],F[i][j][h]-1);
            }
        }
    }
    for (int i=0;i<=m;++i){
        for (int j=0;j<p;++j){
            if (~F[n][i][j]) tomax(ans,j);
        }
    }
    printf("%d",ans);
    return 0;
}
  1. 藤瓜
#include<bits/stdc++.h>
const int N=1e6+5;
int n,m,k,b[N],a[N],sum,T[N],tot,l1[N],r1[N],l2[N],r2[N],ans,ansk;
inline void I(int x,int y){ ++x;for(;x<=k;x+=x&-x) T[x]+=y; }
inline int Q(int x){ ++x;int res=0;for(;x;x-=x&-x) res+=T[x];return res; }
bool tag=1;
signed main(){
    //freopen("data9.in","r",stdin),freopen("data9.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    for (int i=1;i<=m;++i) scanf("%d",&b[i]);
    for (int i=1;i<=n;++i) l1[i]=l2[i]=-1;
    for (int i=1,j=1;i<=n;++i){
        scanf("%d",&a[i]);
        if (j<=m&&b[j]==i){
            if (a[i]<k){
                if (a[i]==0) l1[i]=l2[i]=-1;
                else if (a[i]+sum<k||sum==k-1){
                    l1[i]=(sum+1)%k,r1[i]=(sum+a[i])%k;
                }else{
                    l1[i]=sum+1,r1[i]=k-1;
                    l2[i]=0,r2[i]=(sum+a[i])%k;
                }
                if (~l1[i]) I(l1[i],1),I(r1[i]+1,-1);
                if (~l2[i]) I(l2[i],1),I(r2[i]+1,-1);
            }else ++tot;
            ++j;
        }
        sum=(sum+a[i])%k;
    }
    ans=tot+Q(0),ansk=-1;
    for (int i=1,j=1;i<=n;++i){
        if (j>m) break;
        if (b[j]==i){
            if (a[i]>=k) --tot;
            if (~l1[i]) I(l1[i],-1),I(r1[i]+1,1);
            if (~l2[i]) I(l2[i],-1),I(r2[i]+1,1);
            ++j;
        }
        int res=Q(a[i]%k)+tot;
        if (res>ans) ans=res,ansk=i-1;
        if (b[j-1]==i&&(a[i]>=k||l1[i]==0||l2[i]==0)) ++tot;
    }
    if (!tag) return printf("%d",ans),0;
    if (~ansk) printf("%d\nyes\n%d",ans,ansk);
    else printf("%d\nno",ans);
    return 0;
}
  1. 蒜头2
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int MOD=998244353,M=32001;
int p[M],vis[M],g[M],k[M],idx,m,ans,n;
struct node{
    int a[2][2];
    #define a(p,i,j) p.a[i][j]
} fi,non;
inline node operator * (node x,node y){
    node z;
    a(z,0,0)=a(z,0,1)=a(z,1,0)=a(z,1,1)=0;
    for (int k=0;k<2;++k){
        for (int i=0;i<2;++i){
            for (int j=0;j<2;++j){
                a(z,i,j)=(a(z,i,j)+(LL)a(x,i,k)*a(y,k,j)%MOD)%MOD;
            }
        }
    }
    return z;
}
inline int fib(int b){
    if (b<0) return 0;
    if (b==0) return 1;
    if (b==1) return 1;
    b-=2;
    node s=non,x=non;
    while (b){
        if (b&1) s=s*x;
        x=x*x,b>>=1;
    }
    return a((s*fi),0,0);
}
inline int ny(int x){
    int b=MOD-2,s=1;
    while (b){
        if (b&1) s=(LL)s*x%MOD;
        x=(LL)x*x%MOD,b>>=1;
    }return s;
}
inline void INIT(){
    a(non,0,0)=a(non,1,0)=a(non,0,1)=1;
    a(non,1,1)=0;
    a(fi,0,0)=1,a(fi,1,0)=1;
    a(fi,0,1)=a(fi,1,1)=0;
    for (int i=2;i<M;++i){
        if (!vis[i]) p[++m]=i;
        for (int j=1;p[j]*i<M;++j){
            vis[p[j]*i]=1;
            if (i%p[j]==0) break;
        }
    }
}
int res,sum;
inline int F(int x){
    return (fib(x)+fib(x-2))%MOD;
}
void Dfs2(int tot,int cur,int mu){
    if (!mu) return;
    if (cur>idx){
        //cout<<"Dfs2:: "<<tot<<" "<<mu*F(sum/tot)<<endl;
        res=(res+(LL)mu*F(sum/tot)%MOD)%MOD;
        return;
    }
    Dfs2(tot,cur+1,mu);
    if (k[cur]>0) Dfs2(tot*g[cur],cur+1,-mu);
}
void Dfs1(int tot,int cur){
    if (cur>idx){
        res=0,sum=tot,Dfs2(1,1,1);
        //cout<<"DFS1::: "<<tot<<" "<<res<<endl;
        ans=(ans+(LL)res*ny(tot)%MOD)%MOD;
        return;
    }
    for (int i=0,j=1;i<=k[cur];++i,j*=g[cur]){
        int now=k[cur];
        k[cur]=i;
        Dfs1(tot*j,cur+1);
        k[cur]=now;
    }
}
signed main(){
    //freopen("head9.in","r",stdin);
    //freopen("head9.out","w",stdout);
    INIT();
    int T;cin>>T;
    for (int test=1;test<=T;++test){
        int nn;cin>>n;nn=n;idx=0,ans=0;
        for (int i=1;p[i]*p[i]<=nn;++i){
            if (nn%p[i]==0){
                g[++idx]=p[i],k[idx]=0;
                while (nn%p[i]==0) nn/=p[i],++k[idx];
            }
        }
        if (nn>1) g[++idx]=nn,k[idx]=1;
        Dfs1(1,1);
        cout<<(ans+MOD)%MOD<<endl;
    }
    return 0;
}/*
4
2
3
4
667
*/
  1. 扑克
#include<bits/stdc++.h>
#define gc getchar
#define pc putchar
#define F(i,x,y) for(int i=x;i<=y;++i)
#define R(i,x,y) for(int i=x;i>=y;--i)
inline int read(){
    int x=0;char ch=gc();while (!isdigit(ch)) ch=gc();
    while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^'0'),ch=gc();return x;
}
inline void print(int x){ if (x>9) print(x/10);pc('0'+x%10); }
const int N=2e5+5;
int n,m,A[N],rt,tot;
struct Splay{
    int son[2],fa,sz,sum,rev,val,cnt;
    #define son(i,j) G[i].son[j]
    #define fa(i) G[i].fa
    #define sz(i) G[i].sz
    #define sum(i) G[i].sum
    #define rev(i) G[i].rev
    #define val(i) G[i].val
    #define cnt(i) G[i].cnt
} G[N<<2];
inline void swap(int& x,int& y){
    int z=x;x=y;y=z;
}
inline void maintain(int k){
    if (!k) return;
    sz(k)=sz(son(k,0))+sz(son(k,1))+cnt(k);
    sum(k)=sum(son(k,0))^sum(son(k,1))^((cnt(k)&1)?val(k):0);
}
inline void letrev(int k){
    if (!k) return;
    rev(k)^=1,swap(son(k,0),son(k,1));
}
inline void pushdown(int k){
    if (!rev(k)||!k) return;
    letrev(son(k,0)),letrev(son(k,1));
    rev(k)=0;
}
void _put(int cur){
    if (!cur) return;
    pushdown(cur);
    _put(son(cur,0));
    printf("rt=%d, id=%d, fa=%d, sz=%d, sum=%d, rev=%d, val=%d, cnt=%d, ls=%d, rs=%d\n"
    ,rt,cur,fa(cur),sz(cur),sum(cur),rev(cur),val(cur),cnt(cur),son(cur,0),son(cur,1));
    //F(i,1,cnt(cur)) printf("%d ",val(cur));
    _put(son(cur,1));
}
void OUTPUT(){
    printf("OUT::: \n"),_put(rt),pc('\n');
}
inline int addnod(int c,int v){
    cnt(++tot)=c,val(tot)=v;
    return maintain(tot),tot;
}
inline bool get(int k){ return k==son(fa(k),1); }
inline void rotate(int k){
    int x=fa(k),y=fa(x),p=get(k);
    son(x,p)=son(k,p^1);if (son(x,p)) fa(son(x,p))=x;
    son(k,p^1)=x;fa(x)=k;
    if (y) son(y,x==son(y,1))=k;else rt=k;fa(k)=y;
    maintain(x),maintain(k);
}
inline void splay(int k,int pos){
    if (!k) return;
    for (int i=fa(k);(i=fa(k))!=pos;rotate(k)){
        if (fa(i)!=pos) rotate(get(k)==get(i)?i:k);
    }
}
int remaink;
inline int findk(int k){
    if (k<1||k>sz(rt)) return (remaink=0),0;
    int cur=rt;
    while (cur){
        pushdown(cur);
        if (k<=sz(son(cur,0))) cur=son(cur,0);
        else if (k<=sz(son(cur,0))+cnt(cur)) return (remaink=k-sz(son(cur,0))),cur;
        else k-=sz(son(cur,0))+cnt(cur),cur=son(cur,1);
    }
    return 0;
}
inline int split(int k,int pos){
    if (!k||pos==cnt(k)) return 0;
    if (pos>cnt(k)||pos<0) printf("k = %d, pos = %d, cnt(k) = %d\n",k,pos,cnt(k)),exit(0);
    if (pos==0) return k;
    int cur=addnod(cnt(k)-pos,val(k));
    cnt(k)=pos,son(cur,1)=son(k,1),son(k,1)=cur;
    fa(cur)=k;if (son(cur,1)) fa(son(cur,1))=cur;
    maintain(cur),maintain(k);
    return cur;
}
inline void Insert(int pos,int c,int v){
    int x=findk(pos),cur=addnod(c,v);
    splay(x,0);
    int y=findk(pos+1);
    if (x==y) y=split(x,remaink-1);
    if (y){
        //printf("BEFORE, x=%d, y=%d\n",x,y);OUTPUT();
        splay(y,x);//puts("SPLAyed");OUTPUT();
        son(y,0)=cur,fa(cur)=y;
        maintain(y),maintain(x);
    }else{
        son(x,1)=cur,fa(cur)=x;
        maintain(x);
    }
}
inline void Reverse(int le,int ri){
    if (le==ri) return;
    if (le==1&&ri==sz(rt)) return letrev(rt);
    int x=findk(le-1);
    split(x,remaink);
    splay(x,0);
    int y=findk(ri+1);
    y=split(y,remaink-1);
    if (y){
        splay(y,x);
        letrev(son(y,0));
    }else{
        letrev(son(x,1));
    }
}
inline int mostle(int k){
    if (!k) return 0;
    while ((pushdown(k),son(k,0))) k=son(k,0);
    return k;
}
inline int mostri(int k){
    if (!k) return 0;
    while ((pushdown(k),son(k,1))) k=son(k,1);
    return k;
}
inline void letrot(int cur){
    //printf("cur=%d\n",cur);
    int l=mostle(cur),r=mostri(cur);
    if (cnt(r)>1){
        r=split(r,cnt(r)-1);
        int fr=fa(r);
        if (fr) son(fr,r==son(fr,1))=0;
        son(l,0)=r,fa(r)=l;
        return maintain(fr),maintain(r),maintain(l),splay(l,0),splay(fr,0);
    }else{
        int fr=fa(r);//printf("r=%d, son=%d\n",r,son(r,0));
        if (son(r,0)) fa(son(r,0))=fr;
        if (fr) son(fr,r==son(fr,1))=son(r,0);
        son(r,0)=0,son(l,0)=r,fa(r)=l;
        return maintain(fr),maintain(r),maintain(l),splay(l,0),splay(fr,0);
    }
}
inline void Rotate(int le,int ri){
    if (le==ri) return;
    if (le==1&&ri==sz(rt)){
        return letrot(rt);
    }
    int x=findk(le-1);
    split(x,remaink);
    splay(x,0);
    int y=findk(ri+1);
    y=split(y,remaink-1);
    if (y){
        splay(y,x);
        letrot(son(y,0));
    }else{
        letrot(son(x,1));
    }
}
inline int Sum(int le,int ri){
    if (le==1&&ri==sz(rt)) return sum(rt);
    int x=findk(le-1);
    split(x,remaink);
    splay(x,0);
    int y=findk(ri+1);
    y=split(y,remaink-1);
    if (y){
        splay(y,x);
        return sum(son(y,0));
    }else{
        return sum(son(x,1));
    }
}
int Build(int l,int r){
    if (l>r) return 0;
    if (l==r) return addnod(1,A[l]);
    int mid=l+r>>1,cur=addnod(1,A[mid]);
    son(cur,0)=Build(l,mid-1);
    son(cur,1)=Build(mid+1,r);
    if (son(cur,0)) fa(son(cur,0))=cur;
    if (son(cur,1)) fa(son(cur,1))=cur;
    maintain(cur);
    return cur;
}
signed main(){
    //freopen("data9.in","r",stdin),freopen("data9.out","w",stdout);
    n=read(),m=read();
    F(i,1,n) A[i]=read();
    rt=Build(1,n);
    //OUTPUT();
    F(i,1,m){
        int op=read(),x=read(),y=read();
        if (op==1){
            int z=read();
            Insert(x,y,z);
        }else if (op==2){
            Reverse(x,y);
        }else if (op==3){
            Rotate(x,y);
        }else if (op==4){
            print(Sum(x,y)),pc('\n');
        }
        //OUTPUT();
    }
    return 0;
}
  1. 阿克
#include<bits/stdc++.h>
const int N=2e5+5;
typedef long long LL;
struct Edge{ int val,pos; };
std::vector<Edge> G[N];
int n,k;LL maxn,mid,p,res[N];bool con[N];
#define abs(x) (x>0?x:-(x))
void Dfs(int cur,int fa,int fv){
    for (int i=0;i<(int)G[cur].size();++i){
        int to=G[cur][i].pos,v=G[cur][i].val;
        if (to==fa) continue;
        Dfs(to,cur,v);
        if (abs(res[to])>abs(res[cur])||(abs(res[to])==abs(res[cur])&&res[to]<0)) res[cur]=res[to];
    }
    if (res[cur]>0) con[cur]=0;else if (res[cur]<0) con[cur]=1;
    if (con[cur]&&res[cur]+fv>0) res[cur]=0;
    else if (res[cur]+fv>mid){
        ++p;
        if (-mid+fv>0) res[cur]=0;
        else res[cur]=-mid+fv,con[fa]=(res[cur]==0);
    }else res[cur]+=fv,con[fa]=(res[cur]==0);
}
inline bool check(){
    for (int i=1;i<=n;++i) con[i]=0,res[i]=0;
    p=0;Dfs(1,0,0);
    if (!con[1]||res[1]>0) ++p;
    return p<=k;
}
signed main(){
    //freopen("data9.in","r",stdin),freopen("data9.out","w",stdout);
    scanf("%d%d",&n,&k);
    if (k==n) return putchar('0'),0;
    for (int i=1;i<n;++i){
        int a,b,c;scanf("%d%d%d",&a,&b,&c);
        G[a].push_back((Edge){c,b}),G[b].push_back((Edge){c,a});
        maxn+=c;
    }
    LL le=1,ri=maxn;
    while (le<ri){
        mid=(le+ri)>>1;
        if (check()) ri=mid;
        else le=mid+1;
    }
    printf("%lld",le);
    return 0;
}
  1. 排队
//O(nlogn) Solution
#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false),std::cin.tie(0),std::cout.tie(0)
const int N=1e7+3,INF=1e9+7;
struct node{
    int val,tag;
} G[N];
inline bool operator < (node a,node b){
    return a.val<b.val;
}
int A[N],ans[N],idx=1,n;
signed main(){
    IOS;//freopen("game5.in","r",stdin);freopen("game5.out","w",stdout);
    std::cin>>n;
    for (int i=1;i<=n;++i){
        std::cin>>A[i];
        G[i]=(node){A[i],i};
    }
    std::sort(G+1,G+1+n);
    for (int i=1;i<=n;++i){
        while (idx<=n&&G[idx].val<A[i]){
            if (G[idx].tag>i) ans[G[idx].tag]=i;
            else ans[G[idx].tag]=-1;
            ++idx;
        }
    }
    for (int i=idx;i<=n;++i) ans[G[i].tag]=-1;
    for (int i=1;i<=n;++i) std::cout<<ans[i]<<' ';
    return 0;
}/*
10
2 1 4 7 4 8 3 6 4 7
*/
  1. 平衡树性能测试(随机数据)
//BIT
#include<bits/stdc++.h>
#define gc getchar
#define pc putchar
inline int read(){
    int x=0;char ch=gc();while (!isdigit(ch)) ch=gc();
    while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^'0'),ch=gc();return x;
}
inline void print(int x){ if (x<0) x=-x,pc('-');if (x>9) print(x/10);pc('0'+x%10); }
const int N=1e6+5;
int v[N],qt[N],qx[N],T[N],maxn;
bool vis[N];
struct node{
    int val,tag;
} G[N];
inline void I(int x,int y){ for(;x<=maxn;x+=x&-x) T[x]+=y; }
inline int Q(int x){ int res=0;for(;x;x-=x&-x) res+=T[x];return res; }
inline bool operator < (node a,node b){ return a.val<b.val; }
inline int Findk(int k){
    if (!k) return 0;
    int res=0;
    for (int i=19;~i;--i){
        if (res+(1<<i)>maxn) continue;
        if (T[res+(1<<i)]<k) res+=(1<<i),k-=T[res];
    }
    return res+1;
}
inline void Insert(int x){
    if (vis[x]) return;
    I(x,1),vis[x]=1;
}
inline int Pre(int x){
    return v[Findk(Q(x-1))];
}
signed main(){
    int m=read();v[0]=-1;
    for (int i=1;i<=m;++i){
        qt[i]=read(),qx[i]=read();
        G[i].val=qx[i],G[i].tag=i;
    }
    std::sort(G+1,G+1+m);
    int pre=1<<29;
    for (int i=1;i<=m;++i){
        if (pre!=G[i].val) pre=G[i].val,v[++maxn]=G[i].val;
        qx[G[i].tag]=maxn;
    }
    for (int i=1;i<=m;++i){
        if (!qt[i]) Insert(qx[i]);
        else print(Pre(qx[i])),pc('\n');
    }
    return 0;
}
  1. 平衡树测试(构造数据)

同上。

  1. 链表

云剪贴板

  1. 线性筛
#include<bits/stdc++.h>
namespace LEON{
    #define gc getchar
    #define pc putchar
    #define F(x,y,z) for(int x=y;x<=z;++x)
    inline int read(){
        int x=0;char ch=gc();while (!isdigit(ch)) ch=gc();
        while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^'0'),ch=gc();return x;
    }
    void put(int x){ if (x) put(x/10),pc('0'+x%10); }
    inline void print(int x){ if (!x) pc('0');else put(x);pc('\n'); }
} using namespace LEON;
int f[1000001][3],p[78499];
signed main(){
    int T=read()-1,n=read(),idx=0;
    f[1][2]=1;F(i,2,n){
        if (!f[i][2]) f[i][0]=1,f[i][1]=1,f[i][2]=i-1,p[++idx]=i;
        for (int j=1;p[j]*i<=n;++j){
            f[p[j]*i][0]=f[i][0]+1;
            if (i%p[j]==0){
                f[p[j]*i][1]=f[i][1],f[p[j]*i][2]=f[i][2]*p[j];
                break;
            }
            f[p[j]*i][1]=f[i][1]+1,f[p[j]*i][2]=f[i][2]*(p[j]-1);
        }
    }
    F(i,1,n) print(f[i][T]);
    return 0;
}
  1. AK
#include<cstdio>
#define LL long long
using namespace std;
const int N=1e3+5,MOD=998244353;
const LL INF=1e18;
int A[N][N],nf,f[N*N];
LL F[N][N][3];//0fromup 1fromleft 2fromright
int n,m,K;
inline LL max(LL a,LL b,LL c)
{
    if (a<b) a=b;
    if (a<c) a=c;
    return a;
}
inline int read()
{
    int num=0,p=1;char ch=getchar();
    while (ch>'9'||ch<'0')
    {
        if (ch=='-') p=-1;
        ch=getchar();
    }
    while (ch<='9'&&ch>='0') num=(num<<1)+(num<<3)+(ch^48),ch=getchar();
    return p*num; 
}
inline int pow(int a,int b)
{
    int s=1;
    while (b)
    {
        if (b&1) s=(LL)s*a%MOD;
        a=(LL)a*a%MOD;
        b>>=1;
    }
    return s;
}
int main()
{
    n=read(),m=read(),K=read();
    for (int i=1;i<=n;++i)
        for (int j=1;j<=m;++j)
            A[i][j]=read();
    for (int i=0;i<=n+1;++i)
        for (int j=0;j<=m+1;++j)
            F[i][j][0]=F[i][j][1]=F[i][j][2]=-INF;
    F[1][1][0]=0;
    for (int i=1;i<=n;++i)
    {
        if (i!=1)
            for (int j=1;j<=m;++j)
                F[i][j][0]=max(F[i-1][j][0],F[i-1][j][1],F[i-1][j][2])+A[i][j];
        for (int j=2;j<=m;++j)
            F[i][j][1]=max(F[i][j-1][0],F[i][j-1][1],-INF)+A[i][j];
        if (i!=1)
            for (int j=m-1;j;--j)
                F[i][j][2]=max(F[i][j+1][0],F[i][j+1][2],-INF)+A[i][j];
    }
    int ans=max(F[n][m][0],F[n][m][1],F[n][m][2])%MOD;
    ans=pow(ans,K);
    f[0]=1;
    for (int i=1;i<=n*m;++i) f[i]=(LL)f[i-1]*i%MOD;
    nf=pow(f[n*m],MOD-2);
    for (int i=n*m;i;--i) ans=(LL)ans*nf%MOD,nf=(LL)nf*i%MOD;
    printf("%d",ans);
}
  1. 运算
#include<cstdio>
using namespace std;
char c[1200];int idx=-1;
int main()
{
    char ch=getchar();
    while (ch!=EOF)
    {
        if (ch=='.')
        {
            puts("no");
            return 0;
        }
        c[++idx]=ch;
        ch=getchar();
    }
    if (c[0]=='1'&&(c[1]>'9'||c[1]<'1')) putchar('1');
    else putchar('1'),putchar('/'),puts(c);
}