Codeforces 963A Alternating Sum(等比数列求和+逆元+快速幂)
题目链接: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来实现。
代码:
- #include<cstdio>
- #include<cmath>
- #include<cctype>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #include<vector>
- #include<queue>
- #include<set>
- #include<map>
- #include<stack>
- #include<string>
- #define lc(a) (a<<1)
- #define rc(a) (a<<1|1)
- #define MID(a,b) ((a+b)>>1)
- #define fin(name) freopen(name,"r",stdin)
- #define fout(name) freopen(name,"w",stdout)
- #define clr(arr,val) memset(arr,val,sizeof(arr))
- #define _for(i,start,end) for(int i=start;i<=end;i++)
- #define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
- using namespace std;
- typedef long long LL;
- const LL MOD=1e9+;
- const double eps=1e-;
- string str;
- LL fpow(LL x,LL n){
- LL res=;
- while(n>){
- if(n&) res=res*x%MOD; //如果二进制最低位为1,则乘上x^(2^i)
- x=x*x%MOD; //将x平方并取模
- n>>=;
- }
- return (res%MOD+MOD)%MOD;
- }
- LL extend_gcd(LL a,LL b,LL &x,LL &y){
- if(!b){
- x=;
- y=;
- return a;
- }
- LL gcd=extend_gcd(b,a%b,x,y);
- LL t=x;
- x=y;
- y=t-(a/b)*x;
- return gcd;
- }
- LL NY(LL num){
- LL x,y;
- extend_gcd(num,MOD,x,y);
- return (x%MOD+MOD)%MOD;
- }
- int main(){
- FAST_IO;
- LL n,a,b,k;
- cin>>n>>a>>b>>k;
- cin>>str;
- LL len=(n+)/k;
- LL sum=;
- for(int i=;i<k;i++){
- if(str[i]=='+')
- sum=((sum+fpow(a,n-i)*fpow(b,i))%MOD+MOD)%MOD;
- else
- sum=((sum-fpow(a,n-i)*fpow(b,i))%MOD+MOD)%MOD;
- }
- LL ans;
- //注意,比值q是(b/a)^k而不是(b/a)
- LL q=fpow(NY(a),k)*fpow(b,k)%MOD;
- if(q!=){
- LL _q=NY(q-);
- ans=(sum*(fpow(q,len)-)%MOD*_q%MOD+MOD)%MOD;
- }
- else
- ans=sum*len%MOD;
- cout<<ans<<endl;
- return ;
- }
Codeforces 963A Alternating Sum(等比数列求和+逆元+快速幂)的更多相关文章
- codeforces 963A Alternating Sum
codeforces 963A Alternating Sum 题解 计算前 \(k\) 项的和,每 \(k\) 项的和是一个长度为 \((n+1)/k\) ,公比为 \((a^{-1}b)^k\) ...
- 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)
题目链接:https://ac.nowcoder.com/acm/contest/903/B 题意: 给你 q,n,p,求 q1+q2+...+qn 的和 模 p. 思路:一开始不会做,后面查了下发现 ...
- CodeForces - 598A Tricky Sum (数学,快速幂的运用)
传送门: http://codeforces.com/problemset/problem/598/A A. Tricky Sum time limit per test 1 second memor ...
- Codeforces 963E Alternating Sum 等比数列+逆元
题目大意: 看一下样例就明白了 基本思路: 题目中明确提到k为一个周期,稍作思考,把k项看作一项,然后发现这是个等比数列,q=(b/a)^k, 然后重点就是怎样处理等比数列求和表达式中的除法,这个时候 ...
- CodeForces Round #191 (327C) - Magic Five 等比数列求和的快速幂取模
很久以前做过此类问题..就因为太久了..这题想了很久想不出..卡在推出等比的求和公式,有除法运算,无法快速幂取模... 看到了 http://blog.csdn.net/yangshuolll/art ...
- Codeforces 963A Alternating Sum ( 思维 && 数论 )
题意 : 题目链接 分析 : Tutorial 讲的很清楚 至于为什么这样去考虑 算是一个经验问题吧 如果一个问题要你给出模意义下的答案 就多考虑一下答案是要用逆元构造出来 也就说明有除法的存在 那么 ...
- 牛客网 牛客小白月赛1 I.あなたの蛙が帰っています-卡特兰数,组合数阶乘逆元快速幂
I.あなたの蛙が帰っています 链接:https://www.nowcoder.com/acm/contest/85/I来源:牛客网 这个题有点意思,是卡特兰数,自行百度就可以.卡特兰数用处 ...
- 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)
先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...
- Codeforces 964C Alternating Sum
Alternating Sum 题意很简单 就是对一个数列求和. 题解:如果不考虑符号 每一项都是前一项的 (b/a)倍, 然后考虑到符号的话, 符号k次一循环, 那么 下一个同一符号的位置 就是 这 ...
随机推荐
- python---权限管理和菜单生成
一:表结构(共八张表) from django.db import models # Create your models here. class User(models.Model): userna ...
- 通过TodoList案例对比Vue.js的MVVM设计模式与JQuery的MVP设计模式
Vue MVVM设计模式: 在使用vue进行编程时,不会再涉及到DOM的操作,取而代之的是修改数据层,当把数据进行变更的时候,vue之中它的底层会自动的根据数据的不同帮助我们去重新渲染页面. 编码时不 ...
- 51 nod 1105 第K大的数
1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ...
- HDU 3032 multi-sg 打表找规律
普通NIM规则加上一条可以分解为两堆,标准的Multi-SG游戏 一般Multi-SG就是根据拓扑图计算SG函数,这题打表后还能发现规律 sg(1)=1 sg(2)=2 sg(3)=mex{0,1,2 ...
- 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 ...
- Jdbc druid数据库连接池
//测试类package druid; import util.JdbcUtilsDruid; import java.sql.Connection; import java.sql.Date; im ...
- C++/C中的struct和typedef struct用法和区别
struct和typedef struct 分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int ...
- Celery异步任务队列/周期任务+ RabbitMQ + Django
一.Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celer ...
- ASP.NET 网站部署到IIS上如何进行调试
1:在一个网站成功部署后,有可能会遇到一些错误,但是又不能直接看出错误源(如果能在源程序里下断点进行调试就好了,这样就能准确的找出错误代码),下面介绍如何在一个已经部署的网站上进行断点调试(前提有网站 ...
- 【译】第八篇 Integration Services:高级工作流管理
本篇文章是Integration Services系列的第八篇,详细内容请参考原文. 简介在前面两篇文章,我们创建了一个新的SSIS包,学习了SSIS中的脚本任务和优先约束,并检查包的MaxConcu ...