求和(同余定理)

来源:互联网 发布:域名ftp根目录设置 编辑:程序博客网 时间:2024/04/29 21:15

百度百科 同余定理 欧拉,小费马,中国剩余定理

http://baike.baidu.com/link?url=LXZ1iNqtSZLlsmYnE_cCq_AnKtFKgo8RETByCBmAqwFSnHNEVUb4f6DtOer8GsYg-w-GWZe5oQ3hnqfg9GTpTq


题目意思:

给定a和n,计算a+aa+aaa+aaaa+...+a...a(n个a) 的和。 输入描述:测试数据有多组,以文件结尾。每行输入a,n(1<=a,n<=1000000)。输出描述:由于结果可能比较大,所以请输出答案mod 1000000007。

http://student.csdn.net/mcs/programming_challenges

题目分析:

同余定理:

s=0; 

abc&MOD=((a*10%MOD+b%MOD)*10%MOD+c%MOD)%MOD:    

//迭代形式

s=(s*10%MOD+a%MOD)%MOD

s=(s*10%MOD+b%MOD)%MOD

s=(s*10%MOD+c%MOD)%MOD

abc%MOD=s:

此题需要注意的是,链接的a可能不是一位数,一次需要将a写入字符串(同余)进行操作,见代码注释。

AC代码:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1.   
  2.  *同于定理,需要注意每一次链接的a不一定是一位数 
  3.  *例如输入100 3 
  4.  *1、s=0; s1[3]="100";(a写入字符串) 
  5.  *2、s=(s*10%MOD+(s1[j]-'0'))%MOD; 
  6.  *3、下一次链接下一个数,只需要用s继续链接a即可 
  7.  *4、每一次用sum+=s; 
  8.  */  
  9. #include<iostream>  
  10. #include<cstdio>  
  11. #include<cstring>  
  12. #include<cmath>  
  13. #define MOD 1000000007  
  14. using namespace std;  
  15. int main()  
  16. {  
  17.     int a,n;  
  18.     while(cin>>a>>n){  
  19.         char s1[10];  
  20.         sprintf(s1,"%d",a);//将a写入字符串以便于进行逐个取余,(用同余定理)  
  21.         int len=strlen(s1);  
  22.         long long sum=0,s=0;  
  23.         for(int i=0;i<n;i++){  
  24.             for(int j=0;j<len;j++){//每次将数字a分成为每一位取余与上一个数链接  
  25.                 s=(s*10%MOD+(s1[j]-'0'))%MOD;  
  26.             }  
  27.             sum=(sum%MOD+s%MOD)%MOD;  
  28.             //printf("%s\n",s2);  
  29.         }  
  30.         cout<<sum<<endl;  
  31.     }  
  32.     return 0;  
  33. }  
  34.  

题目意思:

一个很简单的问题,求1^p+2^p+3^p+……+n^p的和。

<pre name="code" class="cpp">#include <iostream>#include<cstdio>#include<cstring>#include<cmath>#define MOD 100003using namespace std;int mod(int a,int b, int d){    int t=1;    if(b==0)        return 1;    if(b==1)        return a%d;         t=mod(a,b>>1,n);   // t=mod(a,b/2,d);     t=t*t%d;        if(b%2==1){   //if(b&1)        t=t*a%d;    }    return t;}int main(){   int a=2,b=1;   int res=0;   for(int i=1;i<=a;i++)   {       int t=(mod(i,b,MOD))%MOD;       res=(res+t)%MOD;   }   cout<<res<<endl;    return 0;}


0 0