题目描述
在幻想乡,西行寺幽幽子是以贪吃闻名的亡灵。不过幽幽子可不是只会吃,至少她还管理着亡灵界。话说在幽幽子居住的白玉楼有一颗常年不开花的樱树——西行妖。幽幽子决定去收集人间的春度,聚集起来让西行妖开花。很快,作为幽幽子家园艺师的魂魄妖梦收集到了 M 个单位的春度。并且在这段时间里,幽幽子计算出要让西行妖开出一朵花需要 N 个单位的春度。现在幽幽子想要知道,使用所有的春度,能够让西行妖开出多少朵花。
输入格式
第 1 行:一个正整数 M
第 2 行:一个正整数 N
N,M 的位数不超过 L,L 的范围在题目后面给出
输出格式
第 1 行:一个整数 ans,表示能开出花的朵数
输入样例
73861758
12471
输出样例
5922
数据范围
对于 60%的数据:L <= 2,000 且 ans <= 2,000
对于 100%的数据:L <= 20,000 且 ans <= 2,000,000,000
就是一个高精除,实在是恶心
代码
#include<iostream>
#include<cstring>
using namespace std;
int la,lb,lc,a[30001],b[30001],c[30001],tmp[30001],i,x,j,d;
string t,s1,s2;
void print(int a[]) {
for(int i=a[0];i>0;i--){cout<<a[i];}
return;
}
int compare(int a[],int b[]) {
if(a[0]>b[0]) return 1;
if(a[0]<b[0]) return -1;
for(int i=a[0];i>0;i--) {
if(a[i]>b[i]) return 1;
if(a[i]<b[i]) return -1;
}
return 0;
}
void numcpy(int p[],int q[],int det){
for(int i=1;i<=p[0];i++)
q[i+det-1]=p[i];
q[0]=p[0]+det-1;
}
void jian(int a[],int b[]) {
int flag,i;
flag=compare(a,b);
if(flag==0){a[0]=0;return;}
if(flag==1) {
for(i=1;i<=a[0];i++) {
if(a[i]<b[i])
a[i+1]--,a[i]=a[i]+10;
a[i]=a[i]-b[i];}
while(a[0]>0&&a[a[0]]==0){a[0]--;}
return;
}
}
void chugao(int a[],int b[],int c[]) {
c[0]=a[0]-b[0]+1;
for(int i=c[0];i>0;i--) {
memset(tmp,0,sizeof(tmp));
numcpy(b,tmp,i);
while(compare(a,tmp)>=0)
c[i]++,jian(a,tmp);
}
while(c[0]>0&&c[c[0]]==0) c[0]--;
return;
}
void adib(string a1,string b1) {
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
a[0]=a1.size();
for(i=1;i<=a[0];i++) a[i]=a1[a[0]-i]-'0';
b[0]=b1.size();
for(i=1;i<=b[0];i++) b[i]=b1[b[0]-i]-'0';
chugao(a,b,c);
print(c);
return;
}
int main() {
cin>>s1>>s2;
adib(s1,s2);
return 0;
}