题目描述 Description
jrMz 很喜欢动漫《叛逆的鲁鲁修》(额= =不知道是不是因为他盯上了动画片里的 MM),他
准备以一种神奇的方式降临《叛逆的鲁鲁修》世界,所以他先从《变形金刚》里把大黄蜂拐
了出来,然后成功加入了黑色骑士团。不过比较坑的事情出现了,正在与机甲激烈战斗中的
大黄蜂突然 WA 了,只有输入密码才能使它 AC,不幸的是 jrMz 已经忘记了密码。大黄蜂
的密码是一个 N 位的十进制非负整数(允许前缀 0),为了防止遗忘, jrMz 曾经将密码记了
下来。出于保密他没有将密码按原样记录(作死啊= =),于是他将他的密码乘以 E,其中
E=233……3(共 N-1 个 3),然后将结果的最后 N 位(保留前缀 0)进行记录。看着本来正
在欣赏他飒爽风姿的 MM(此仅仅是举例,举例!比如说鲁鲁修的妹妹什么的……), jrMz
只好紧握住你的双手向你求助了。
输入描述 Input Description
仅一行,一个 N 位的十进制非负整数,表示密码与 E 的乘积的最后 N 位。
输出描述 Output Description
仅一行,一个 N 位的十进制非负整数,表示密码。
样例输入 Sample Input
178
样例输出 Sample Output
666
数据范围及提示 Data Size & Hint
【 Sample Explanation】
在所有三位十进制非负整数中,只有 666,满足其与 233 的乘积( 155178)的最后 3 位是 178。
【 Data Size】
对于 30%的数据, N<=7;
对于 60%的数据, N<=1,000;
对于 100%的数据, 3<=N<=1,000,000。
#include<cstdio> #include<cstring> char a[1000010],ans[1000010]; int main(){ scanf("%s",ans); int n=strlen(ans),g=ans[n-1]-'0',k=0; for(int i=n-1;i>=0;i--) a[n-i]=ans[i]-'0'; memset(ans,0,sizeof(ans)); for(int i=1;i<=n;i++){ ans[i]+=a[i]*3; ans[i+1]+=ans[i]/10; ans[i]=ans[i]%10; } ans[n]=(ans[n]+g)%10; for(int i=1;i<=n;i++){ a[i]=k-ans[i]; if(a[i]<0){a[i]+=10;k=-1;} } for(int i=n;i>0;i--) printf("%d",a[i]); return 0; } //origin #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<queue> #include<vector> #include<stack> #include<map> using namespace std; int n,a[2000015],b[2000015],c[2000015],d[2000015]; const int ans[10] = {0,7,4,1,8,5,2,9,6,3}; inline int getans(int w){ int cmd = 3; for(int i = 1;i <= n;i++){ if(i == n) cmd = 2; if(w == 0) break; for(int j = w-1;j < w;j++){ c[i+j-1] += cmd*b[j]; c[i+j] += c[i+j-1]/10; c[i+j-1] %= 10; } } return ans[(a[w]-c[w]+10)%10]; } int main(){ n = 0; char cmd; while(1){ cmd = getchar(); if(cmd < 48) break; d[++n] = cmd-'0'; } for(int j = n;j >= 1;j--) a[j] = d[n-j+1]; for(int i = 1;i <= n;i++){ b[i] = getans(i); } for(int i = n;i >= 1;i--)printf("%d",b[i]); return 0; }