抽屉原理3--如何处理大容量的

来源:互联网 发布:nzt软件下载 编辑:程序博客网 时间:2024/06/01 08:30

问题症结:

     该题不能像抽屉原理2中,直接开一个1000多的数组来存放答案,直接按下标索引,按照这个方法,需要开的数组太大,1,000,000,000,内存撑不住。

解决办法:

     题目要求直接取最后一位数,所以,10个数字必然至少有1个数字会重复出现,找出这个周期。找周期的方法:不能用刚开始的这一个数字作为开始找,因为最初的数字,在不稳定之前不一定会反复出现。故而该程序就取第10个数字(这个肯定会在后面重复出现的,故而可选),这里找出了周期。后面即将第10个数字作为基址,按照周期来查找。

题目背景:

     

代码:

#include<iostream>using namespace std;int main(){int n,m;int val;cin>>n;int arr[32];int dis;while(n--){cin>>m;int mm = m;m = m % 10;val = m;int i;int st;for(i=0; i<32; i++){arr[i] = val;val = val*m%10;}for(i=11; i<32; i++){if(arr[i] == arr[10]){dis = i - 10;break;}}for(i=0; i<32; i++){if(arr[i] == arr[10]){st = i;break;}}if(mm < 32){cout<<arr[mm -1]<<endl;}else{i = (mm - 1 - st) % dis;cout<<arr[st + i]<<endl;}}return 0;}