2019.7.10 校内测试题 勇敢的热气球驾驶者
题目
勇敢的热气球驾驶者(balloonist.cpp,1s,512MB)
【问题描述】:
十名数学家正驾驶着热气球在太平洋上空飞行。当他们通过赤道上空时,他
们决定开一瓶香槟来庆祝一下。不幸的是,香槟瓶上软木塞把热气球冲出了一个
洞,氢气开始泄露、气球开始下降,不久他们将会坠入大海并被饥饿的鲨鱼吃掉。
但是也不是一点转机都没有,只要这些热气球驾驶者有一人能够牺牲自己跳
出去,热气球将可以延长一点时间坠入大海等待救援。现在的问题是谁愿意牺牲
自己跳出去呢?为了公平地解决这个难题,数学家从 1 到 10 进行了编号,先每
人写一个整数 ai(1<=ai<=10000),然后计算出 a1*a2*…*a10 的正整数因子的个
数 N,例如 6 的正整数因子个数为 4(它们是 1,2,3,6)。,那个被扔出去的英
雄就是 N 的最后一位数字。你的任务是找到这个数字。
【输入文件】:
输入文件包括 10 个用空格隔开的数字 ai
【输出文件】:
只有一个单独数字(0 到 9),即 N 的最后一位
【输入输出样例】:
balloonist.in
1 2 6 1 3 1 1 1 1 1
balloonist.out
9
【数据规模】:
30%的数据满足 1<n<=10000; 100%的数据满足 1<n<=2^31-1。
考试得分: 50
主要算法 : 质数(质因数分解),组合数学
应试策略:
- 看题目,第一个想到的就是直接相乘,然后一直模拟算出其因子个数,这是个大数啊!一共40位,long long 不行啊,高精度行吗?sqrt(大数)为20为超过了long long,高精除以高精,太麻烦了啊!
- 那么将其质因数分解化为质数的幂的乘积的形式,发现好像是个组合数学的题目,哎呀呀,好开心,考虑到一个质数选还是不选,选几个,则可以知道,将每一个数质因数分解,将所有质因数的幂加1的基础上求出其乘积,边乘边MOD
- en,忘记打long long了,结果挂了
代码
#include<math.h> #include<stdio.h> #include<stdlib.h> #define LL long long #define FORa(i,s,e) for(LL i=s;i<=e;i++) #define FORs(i,s,e) for(LL i=s;i>=e;i--) #define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,100000,stdin),stdin)?EOF:*pa++ #define File(name) freopen(name".in","r",stdin);freopen(name".out","w",stdout); using namespace std; static char buf[100000],*pa=buf,*pb=buf; inline LL read(); const LL N=10000; LL ans=1,a[11],ct[N+1]; bool Check(LL x) { FORa(i,2,sqrt(x)) while(x%i==0) ++ct[i],x/=i; if(x>1) ++ct[x]; } int main() { File("balloonist"); FORa(i,1,10) a[i]=read(),Check(a[i]); FORa(i,2,N) if(ct[i]) ans=(ans*(ct[i]+1))%10; printf("%lld",ans); return 0; } inline LL read() { register LL f(1),x(0);register char c(gc); while(c<'0'||c>'9') f=c=='-'?-1:1,c=gc; while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=gc; return f*x; }
非完美算法:
照搬应试策略
正解:
打个long long解决问题
总结:
- 考虑题目的顺序,第一:看题目说明,本次考试没有,大型考试都有。第二:看题目名与空间时间限制。第三:注意审题,兄嘚,能一字一字先读一遍,在提炼题干好吗?第三:注意各个输入与输出的数据范围。第四:注意先打暴力放在那里,暴力一定要经过自己手动的特殊数据考验成功,暴力一定要对,慢慢想正解,最后对拍验证,一定要打对拍,不是部分小数据验算
- 正解先想一下数学好吗?