题目链接:http://codeforces.com/problemset/problem/963/A

题目大意:就是给了你n,a,b和一段长度为k的只有'+'和‘-’字符串,保证n+1被k整除,让你你计算

解题思路:

暴力肯定超时的,我们可以先计算出0~k-1这一段的值,当做a1,可以发现如果把每段长度为k的段的值当做一个元素,他们之间是成等比的,比值q=(b/a)^k,

然后就直接用等比数列求和公式求出答案即可。昨天把q当成b/a了,我的脑子啊。。。

注意,判断q==1时不能通过判断a==b,而是判断(a/b)^k==1来实现。

代码:

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<cctype>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<vector>
  8. #include<queue>
  9. #include<set>
  10. #include<map>
  11. #include<stack>
  12. #include<string>
  13. #define lc(a) (a<<1)
  14. #define rc(a) (a<<1|1)
  15. #define MID(a,b) ((a+b)>>1)
  16. #define fin(name) freopen(name,"r",stdin)
  17. #define fout(name) freopen(name,"w",stdout)
  18. #define clr(arr,val) memset(arr,val,sizeof(arr))
  19. #define _for(i,start,end) for(int i=start;i<=end;i++)
  20. #define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
  21. using namespace std;
  22. typedef long long LL;
  23. const LL MOD=1e9+;
  24. const double eps=1e-;
  25.  
  26. string str;
  27.  
  28. LL fpow(LL x,LL n){
  29. LL res=;
  30. while(n>){
  31. if(n&) res=res*x%MOD; //如果二进制最低位为1,则乘上x^(2^i)
  32. x=x*x%MOD; //将x平方并取模
  33. n>>=;
  34. }
  35. return (res%MOD+MOD)%MOD;
  36. }
  37.  
  38. LL extend_gcd(LL a,LL b,LL &x,LL &y){
  39. if(!b){
  40. x=;
  41. y=;
  42. return a;
  43. }
  44. LL gcd=extend_gcd(b,a%b,x,y);
  45. LL t=x;
  46. x=y;
  47. y=t-(a/b)*x;
  48. return gcd;
  49. }
  50.  
  51. LL NY(LL num){
  52. LL x,y;
  53. extend_gcd(num,MOD,x,y);
  54. return (x%MOD+MOD)%MOD;
  55. }
  56.  
  57. int main(){
  58. FAST_IO;
  59. LL n,a,b,k;
  60. cin>>n>>a>>b>>k;
  61. cin>>str;
  62. LL len=(n+)/k;
  63. LL sum=;
  64. for(int i=;i<k;i++){
  65. if(str[i]=='+')
  66. sum=((sum+fpow(a,n-i)*fpow(b,i))%MOD+MOD)%MOD;
  67. else
  68. sum=((sum-fpow(a,n-i)*fpow(b,i))%MOD+MOD)%MOD;
  69. }
  70. LL ans;
  71. //注意,比值q是(b/a)^k而不是(b/a)
  72. LL q=fpow(NY(a),k)*fpow(b,k)%MOD;
  73. if(q!=){
  74. LL _q=NY(q-);
  75. ans=(sum*(fpow(q,len)-)%MOD*_q%MOD+MOD)%MOD;
  76. }
  77. else
  78. ans=sum*len%MOD;
  79. cout<<ans<<endl;
  80. return ;
  81. }

Codeforces 963A Alternating Sum(等比数列求和+逆元+快速幂)的更多相关文章

  1. codeforces 963A Alternating Sum

    codeforces 963A Alternating Sum 题解 计算前 \(k\) 项的和,每 \(k\) 项的和是一个长度为 \((n+1)/k\) ,公比为 \((a^{-1}b)^k\) ...

  2. 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)

    题目链接:https://ac.nowcoder.com/acm/contest/903/B 题意: 给你 q,n,p,求 q1+q2+...+qn 的和 模 p. 思路:一开始不会做,后面查了下发现 ...

  3. CodeForces - 598A Tricky Sum (数学,快速幂的运用)

    传送门: http://codeforces.com/problemset/problem/598/A A. Tricky Sum time limit per test 1 second memor ...

  4. Codeforces 963E Alternating Sum 等比数列+逆元

    题目大意: 看一下样例就明白了 基本思路: 题目中明确提到k为一个周期,稍作思考,把k项看作一项,然后发现这是个等比数列,q=(b/a)^k, 然后重点就是怎样处理等比数列求和表达式中的除法,这个时候 ...

  5. CodeForces Round #191 (327C) - Magic Five 等比数列求和的快速幂取模

    很久以前做过此类问题..就因为太久了..这题想了很久想不出..卡在推出等比的求和公式,有除法运算,无法快速幂取模... 看到了 http://blog.csdn.net/yangshuolll/art ...

  6. Codeforces 963A Alternating Sum ( 思维 && 数论 )

    题意 : 题目链接 分析 : Tutorial 讲的很清楚 至于为什么这样去考虑 算是一个经验问题吧 如果一个问题要你给出模意义下的答案 就多考虑一下答案是要用逆元构造出来 也就说明有除法的存在 那么 ...

  7. 牛客网 牛客小白月赛1 I.あなたの蛙が帰っています-卡特兰数,组合数阶乘逆元快速幂

    I.あなたの蛙が帰っています   链接:https://www.nowcoder.com/acm/contest/85/I来源:牛客网     这个题有点意思,是卡特兰数,自行百度就可以.卡特兰数用处 ...

  8. 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)

    先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...

  9. Codeforces 964C Alternating Sum

    Alternating Sum 题意很简单 就是对一个数列求和. 题解:如果不考虑符号 每一项都是前一项的 (b/a)倍, 然后考虑到符号的话, 符号k次一循环, 那么 下一个同一符号的位置 就是 这 ...

随机推荐

  1. python---权限管理和菜单生成

    一:表结构(共八张表) from django.db import models # Create your models here. class User(models.Model): userna ...

  2. 通过TodoList案例对比Vue.js的MVVM设计模式与JQuery的MVP设计模式

    Vue MVVM设计模式: 在使用vue进行编程时,不会再涉及到DOM的操作,取而代之的是修改数据层,当把数据进行变更的时候,vue之中它的底层会自动的根据数据的不同帮助我们去重新渲染页面. 编码时不 ...

  3. 51 nod 1105 第K大的数

    1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ...

  4. HDU 3032 multi-sg 打表找规律

    普通NIM规则加上一条可以分解为两堆,标准的Multi-SG游戏 一般Multi-SG就是根据拓扑图计算SG函数,这题打表后还能发现规律 sg(1)=1 sg(2)=2 sg(3)=mex{0,1,2 ...

  5. 11 Facts about Data Science that you must know

    11 Facts about Data Science that you must know Statistics, Machine Learning, Data Science, or Analyt ...

  6. Jdbc druid数据库连接池

    //测试类package druid; import util.JdbcUtilsDruid; import java.sql.Connection; import java.sql.Date; im ...

  7. C++/C中的struct和typedef struct用法和区别

    struct和typedef struct 分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int ...

  8. Celery异步任务队列/周期任务+ RabbitMQ + Django

    一.Celery介绍和基本使用  Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celer ...

  9. ASP.NET 网站部署到IIS上如何进行调试

    1:在一个网站成功部署后,有可能会遇到一些错误,但是又不能直接看出错误源(如果能在源程序里下断点进行调试就好了,这样就能准确的找出错误代码),下面介绍如何在一个已经部署的网站上进行断点调试(前提有网站 ...

  10. 【译】第八篇 Integration Services:高级工作流管理

    本篇文章是Integration Services系列的第八篇,详细内容请参考原文. 简介在前面两篇文章,我们创建了一个新的SSIS包,学习了SSIS中的脚本任务和优先约束,并检查包的MaxConcu ...