#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b) //greatest common divisor 最大公约数
{
int t;
while(a%b != 0){
t = a%b;
a=b;
b=t;
}
return b;
}
bool ipsr(int n)//is_prime Square root Exhaustive method 开方列举法判素数
{
if(n == 1) return 0;
for(int i=2;i*i<=n;i++){
if(n % i == 0) return 0;
}
return 1;
}
void iper(int n)//is_prime sieve of Eratosthenes 埃氏筛判素数法
{
int prime[5000050];
for(int i=1;i<=n;i++){
prime[i] = 1;
}
prime[0] = prime[1] = 0;
for(int i =2;i*i<n;i++){
if(prime[i]){
for(int j=i*i;j<=n;j+=i){
prime[j]=0;
}
}
}
}
void prfac1(int n){//Prime factorization 质因数分解
int sum=n;
int f=0;
for(int i=2;i<=n;i++){
while(n%i==0&&n!=1){
if(f==0){
cout<<i;
f=1;
}
else{
cout<<'*'<<i;
}
n/=i;
}
}
cout<<'='<<sum<<endl;
}
void prfac2(int n){//Prime factorization 质因数分解
int sum=n;
int f=0;
cout<<sum<<'=';
for(int i=2;i<=n;i++){
while(n%i==0&&n!=1){
if(f==0){
cout<<i;
f=1;
}
else{
cout<<'*'<<i;
}
n/=i;
}
}
}
string abs(string n){//absolute value 数的绝对值
if(n[0] == '-'){
n.erase(0,1);
}
return n;
}
int ioc(char c){//int of char char的整形
return c-'0';
}
int tnd(string n,int o){//The no.n digit of a number n的第o位
return n[n.length()-o];
}
string plusf(string a1,string b1){ //高精加法
int a[1005]={},b[1005]={},c[1005]={};
int alen = a1.size(),blen=b1.size();
for(int i=0;i<=alen-1;i++) a[alen-i-1] = a1[i]-48;
for(int i=0;i<=blen-1;i++) b[blen-i-1] = b1[i]-48;
int len = max(alen,blen),x=0;
for(int i=0;i<=len-1;i++){
c[i] = a[i] + b[i] + x;
x=c[i]/10;
c[i] = c[i] % 10;
}
if(x!=0) c[len++] = x;
while(c[len-1] == 0&&len>1){
len--;
}
string output = "";
for(int i=len-1;i>=0;i--) output+=char(c[i]+48);
return output;
}
string minusf(string a1,string b1){ //高精减法
int a[1005]={},b[1005]={},c[1005]={};
if(a1.size()<b1.size()||a1.size()==b1.size()||a1<b1){
cout<<"-";
swap(a1,b1);
}
int alen = a1.size(),blen=b1.size();
for(int i=0;i<=alen-1;i++) a[alen-i-1] = a1[i]-48;
for(int i=0;i<=blen-1;i++) b[blen-i-1] = b1[i]-48;
int len = max(alen,blen),x=0;
for(int i=0;i<=len-1;i++){
if(a[i]<b[i]){
a[i+1]--;
a[i]+=10;
}
c[i] = a[i] - b[i];
}
if(x!=0) c[len++] = x;
while(c[len-1] == 0&&len>1){
len--;
}
string output = "";
for(int i=len-1;i>=0;i--) output+=char(c[i]+48);
return output;
}
string multf(string a1,string b1){
int lena=a1.size();
int lenb=b1.size();
//2.将字符串倒序存储在整数类型数组中
int a[205]={},b[205]={},c[405]={};
for(int i=0;i<lena;i++) a[lena-i-1]=a1[i]-'0';
for(int i=0;i<lenb;i++) b[lenb-i-1]=b1[i]-'0';
//3.计算:高精度乘法
for(int i=0;i<lena;i++){
int x=0; //先定义进位,并归0
for(int j=0;j<lenb;j++){
c[i+j]=c[i+j]+a[i]*b[j]+x;
//每次计算后的结果+进位
x=c[i+j]/10;//计算后十位上的数当作进位
c[i+j]=c[i+j]%10; //个位上的数放在当前位置
}
//进位
c[i+lenb]=x;
}
//4.清除前导0
int len=lena+lenb;
while( c[len-1]==0 && len>1 )len--;
//5.倒序输出结果
string output = "";
for(int i=len-1;i>=0;i--) output += char(c[i]+48);
return output;
}
string divmbl(string a1,int b){//高精度除以低精度
int lena=a1.size(),a[105]={},c[105]={};
//2.将字符串正序存储到整数类型数组中
for(int i=0;i<lena;i++){
a[i+1]=a1[i]-'0';
}
//3.计算,高精度除以低精度
int x=0; //x:表示每一次除以b后的余数
for(int i=1;i<=lena;i++){
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
//4.去除先导0
}
int lenc=1; //除法要从前往后循环去除
while( c[lenc]==0 && lenc<lena) lenc++;
//5.正序输出结果
string output;
for(int i=lenc;i<=lena;i++){
output += char(c[i]+48);
}
return output;
}
01-25
3059
02-05