D题
首先有以下性质
1. (a+b)%mod 等价于 a%mod + b%mod
2. a*b%mod 等价于 a%mod*b%mod (仅当a*b没有溢出时)
该题求解gcd(a,b) a是大数
根据辗转相除法
gcd(a,b)=gcd(b,a%b)
因此我们可以先求a%b把a限制在1e9的范围内,然后做gcd
因为a很大,又可以表示为
(其中n为字符串的长度,ai为第i个字符)
又由性质1和2,我们就可以对每个ai求mod,同时通过乘和累加求出
#include<bits/stdc++.h> using namespace std; #define int long long #define inf 0x3f3f3f3f3f3f3f3f string str; int b; void solve(){ cin>>str; cin>>b; int res=0; for(int i=0;i<str.size();i++){ int t=str[i]-'0'; res*=10; res+=t; res%=b; } cout<<gcd(res,b)<<endl; } signed main(){ int t=1;ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); //cin>>t; while(t--)solve(); return 0; }