codevs4343 找回密码

题目描述 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;
}
原文地址:https://www.cnblogs.com/hyfer/p/5851904.html