nyist 640 Geometric sum

题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=640

 

求x+x^1+x^2+....x^n  %c

当n为基数时;

这个式子 sum(x,n)= sum(x,n/2) * pow(x,n/2+1) +x

sum = (sum + x )%c

n为偶数时

sum(x,n) = sum(x,n/2) * pow(x,n/2) +1

然后使用快速幂,乘得出结果(其实我yy了一下的,一开始没有想到。。。。。。。。)

 1 #include <stdio.h>
 2 
 3 long long chenfa(long long a,long long b,long long c)//a*b%c
 4 {
 5     long long tmp = 0;
 6     a %= c;
 7     b %= c;
 8     while(a)
 9     {
10         if(a&1)
11             tmp = (tmp+b)%c;
12         a >>=1;
13         b <<=1;
14         b %= c;
15     }
16     return tmp;
17 }
18 
19 long long pow1(long long a,long long b,long long c)//a^b%c
20 {
21     long long tmp = 1;
22     while(b)
23     {
24         if(b&1)
25          tmp = chenfa(a,tmp,c);
26 
27          b >>= 1;
28          a = chenfa(a,a,c);
29     }
30     return tmp;
31 }
32 
33 long long sum(long long a,long long b,long long c)//a +a^1 + a^2...+a^b %c
34 {
35     long long tmp = 0;
36     if(b == 1)
37      {
38          tmp = a%c;
39      }
40      else
41      {
42     if(b&1)
43      {
44          tmp = chenfa(sum(a,b/2,c),pow1(a,b/2+1L,c)+a,c);
45          tmp = (tmp +a )%c;
46      }
47      else
48      {
49          tmp = chenfa(sum(a,b/2,c),pow1(a,b/2,c)+1L,c);
50      }
51 
52      return tmp;
53      }
54 }
55 int main()
56 {
57     long long a,b,c;
58     while(scanf("%lld%lld%lld",&a,&b,&c) != EOF)
59     {
60         printf("%lld\n",sum(a,b,c));
61     }
62     return 0;
63 }

 

转载于:https://www.cnblogs.com/yyroom/archive/2013/04/15/3022532.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值