1494. 密码

Description

在浩浩茫茫的苍穹深处,住着上帝和他的神仆们,他们闲谈着下界的凡人俗事,对人世间表现的聪明智慧,大加赞赏。今天他们正在观赏大地风光人情之际,忽然从遥远的东海之滨传来一阵欢笑声,上帝纵目望去,只见中山纪念中学内聚集了全中山市的中小学精英学生,他们要干什么呢?
原来他们都在做一种破译密码的游戏,人们发现:将密码棒上的数字全部相乘,就是开启天庭司粮库密码锁的密码。
如:12×34×56=22848,则22848就是一组有效的密码。
“太简单了!”人们高呼起来,继续探索着。
“这不过是早期的密码系统而已。”上帝轻蔑地环顾着神仆们说道。
可是,当人们演算了123×456×789=44253432后,上帝的神色喀什不对了,要知道,44253432是一个特别的数字,这可是天庭的机密,是谁将这些机密泄露给世人的呢?
于是,上帝搬出一张牌,对司粮库主管得墨忒耳说:“将这张牌打出去,看看他们还逞能不?”
这是天庭的其中一张王牌,但平凡得很,只不过将密码的位数增大而已,可是难就难看在看到文件:password.in中的数字后,必须在1秒内将密码输出到文件:password.out中,否则这组密码就失效了。
上帝还是仁慈的,没有将更难得牌打出来,他想把天庭的粮食恩慈人间,但他绝不会将好处给那些不动脑子的人。现在请你解开天庭司粮库密码锁的密码,帮助人们获得天庭恩赐的粮食。

Input

输入文件password.in的第一行只有一个正整数n,表示密码共有n个乘积因子。
第二行至第n+1行共n行,每行有一个小于1×10^24的正整数。这n个数均为密码的乘积因子。

Output

输出文件password.out只有一行,该行只有一个正整数,为求得的密码值。

Sample Input

3
12
34
56

Sample Output

22848

Data Constraint

Hint

【数据限制】
30%的数据,1≤n≤6,且输入的每个乘积因子均小于1000。
70%的数据,1≤n≤20。
100%的数据,1≤n≤100。

Solution

高精度模板题,详情请看超链接。

Code

#include<cstdio> 
#include<cstring>
#include<algorithm>
#define I int
#define ll long long
#define F(i,a,b) for(I i=a;i<=b;i++)
#define Fd(i,a,b) for(I i=a;i>=b;i--)
#define N 110
#define M 100000000
using namespace std;
I n,len,now;
ll x,a[24*N],b[10],c[24*N],p[12];
char s[N];
I main(){
	freopen("password.in","r",stdin);
	freopen("password.out","w",stdout);
	p[1]=1;
	F(i,2,9) p[i]=p[i-1]*10;
	scanf("%d\n",&n);
	scanf("%s",s+1);
	len=strlen(s+1);
	F(i,1,len){
		now=(i-1)%8+1;
		a[a[0]+=(now==1)]+=p[now]*(s[len-i+1]-'0');
	}
	n--;
	while(n--){
		scanf("%s",s+1);
		memset(b,0,sizeof b);
		len=strlen(s+1);
		F(i,1,len){
			now=(i-1)%8+1;
			b[b[0]+=(now==1)]+=p[now]*(s[len-i+1]-'0');
		}
		F(i,1,(c[0]=a[0]+b[0]-1)+3) c[i]=0;
		F(i,1,a[0]){
			F(j,1,b[0]){
				c[i+j-1]+=a[i]*b[j];
				c[i+j]+=c[i+j-1]/M;
				c[i+j-1]%=M;
			}
		}
		while(c[c[0]+1]){
			c[0]++;
			c[c[0]+1]+=c[c[0]]/M;
			c[c[0]]%=M;
		}
		F(i,0,c[0]) a[i]=c[i];
	}
	printf("%d",a[a[0]]);
	Fd(i,a[0]-1,1) printf("%08d",a[i]);
	return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值