2011的N次方的后四位

云斜月 2013-04-05 07:37:38
求思路,我觉得和11有关系,11的N次方的后三位就是2011的N次方的后三位,具体对不对我不确定,求解答,求思路
...全文
482 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
云斜月 2013-04-05
  • 打赏
  • 举报
回复
时间限制: 1000ms 内存限制: 65536kB 描述 已知长度最大为200位的正整数n,请求出2011^n的后四位。 输入 第一行为一个正整数k,代表有k组数据,k<=200接下来的k行, 每行都有一个正整数n,n的位数<=200 输出 每一个n的结果为一个整数占一行,若不足4位,去除高位多余的0 样例输入 3 5 28 792 样例输出 1051 81 5521 这个是题目。。。
云斜月 2013-04-05
  • 打赏
  • 举报
回复
那道题目是需要是200位的正整数,但是我就整了200个数,,200位应该怎么存,难道需要分开存,,,,
云斜月 2013-04-05
  • 打赏
  • 举报
回复
#include<iostream>
#include<list>
#include<vector>
#include<string>
#define SIZE 201
using namespace std;

void calcuate( )
{
		int m=0;
		int n;
		vector<int>store;
	int  array[SIZE][SIZE];
	  array[1][1]=1;
	  array[2][1]=1;
	  array[2][2]=1;
	  array[3][1]=1;
	  array[3][2]=2;
	  array[3][3]=1;
	for(int i=4;i<SIZE;++i )
	{
		array[i][i]=1;
		 array[i][1]=1;
		for(int j=i-1,line=i-1;j>1;--j)
		{	
		/*	if(i==25)
		  		cin>>n;*/
			
			if((array[line][j]+array[line][j-1])<10&&m==0)
				array[i][j]=(array[line][j]+array[line][j-1]);
			else if((array[line][j]+array[line][j-1])<10&&(array[line][j]+array[line][j+1])>=10)
					array[i][j]=((array[line][j]+array[line][j-1])+1)%10;
			
			else 
			{	 
				if((array[line][j]+array[line][j-1])<10)
					   array[i][j]=(array[line][j]+array[line][j-1]);
				if(((array[line][j]+array[line][j-1])>=10))
											++m;

			 if(((array[line][j]+array[line][j-1])>=10)&&(m==1))
				array[i][j]=(array[line][j]+array[line][j-1])%10;
			else
				array[i][j]=(array[line][j]+array[line][j-1])%10+(array[line][j]+array[line][j-1])/10;
		}	
		
		}
		m=0;
		
	}
	cin>>n;

	for(int i=0;i<n;++i)
	{	   cin>>m;
	store.push_back(m);
	cin.clear();


	}
	for(int i=0;i!=store.size();++i)
	{
		int four=(store[i]*2+array[store[i]+1][store[i]+1-3])%10;
        cout<<four*1000+array[store[i]+1][store[i]+1-2]*100+array[store[i]+1][store[i]+1-1]*10+array[store[i]+1][store[i]+1]<<endl;
	}

}

int main()
{
	
	calcuate();
	
	return 0;
}
gamer67 2013-04-05
  • 打赏
  • 举报
回复
引用 6 楼 li744831579 的回复:
引用 4 楼 gamer67 的回复:A*B的后四位只与A的后四位和B有关。 所以 你可以每次乘2011 然后mod10^4 。不明白,,,,能不能详细点哈,
你的想法有点偏了 这就是个数学问题 所以只要你明白了他的数学原理 就很简单。 a*b的后四位只与a的后四位和b有关。 假设a=a1*10^x1+a2*10^x2+...+a4*10^x4+a的后四位。 a*b=(a1*10^x1+a2*10^x2+...+a4*10^x4+a的后四位)*b 上式的前面几项乘以b都会有10^4这个因子,所以a*b的后四位和a的后四位*b同余。
云斜月 2013-04-05
  • 打赏
  • 举报
回复
引用 7 楼 Athenacle_ 的回复:
2011 = 2000 + 11 2000的后n次方的4位必定是0 计算11的n次方的后4位就行了
你忽略了点东西,倒数第四位应该是2N+11^N 的倒数第四位
云斜月 2013-04-05
  • 打赏
  • 举报
回复
我这样想的,相当于求11^N+2000N*11^(N-1)。最后就是求2*N+11^N的第四位,后三位就是11^N的后三位了,
zhcosin 2013-04-05
  • 打赏
  • 举报
回复
建议你看下《初等数论》,实际上用二项式定理就搞定了
Athenacle_ 2013-04-05
  • 打赏
  • 举报
回复
2011 = 2000 + 11 2000的后n次方的4位必定是0 计算11的n次方的后4位就行了
云斜月 2013-04-05
  • 打赏
  • 举报
回复
引用 4 楼 gamer67 的回复:
A*B的后四位只与A的后四位和B有关。 所以 你可以每次乘2011 然后mod10^4 。
不明白,,,,能不能详细点哈,
leizh007 2013-04-05
  • 打赏
  • 举报
回复
如何求a的平方的后三位,只需要计算a的后三位的平方就行 a=x*1000+y; y表示a的后三位,x为前面的 a*a=(x*1000+y)*(x*1000+y)=x*x*1000*1000+2*x*y*1000+y*y 所以a*a的后三位为y*y的后三位。 这就是MOD运算,你可以看看这方面东西。 (a*b)modc=(amodc*bmodc)modc
gamer67 2013-04-05
  • 打赏
  • 举报
回复
A*B的后四位只与A的后四位和B有关。 所以 你可以每次乘2011 然后mod10^4 。
云斜月 2013-04-05
  • 打赏
  • 举报
回复
2011分解为(2000+11)。然后计算(2000+11)^N 次方
leizh007 2013-04-05
  • 打赏
  • 举报
回复
看错了 就是11的n次方的后三位
leizh007 2013-04-05
  • 打赏
  • 举报
回复
才2011,直接算出来MOD1000不就行了

64,660

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧