CF963A Alternating Sum

2024-01-30 03:58
文章标签 sum alternating cf963a

本文主要是介绍CF963A Alternating Sum,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Alternating Sum

题目传送门

思路:这道题呀,需要涉及到两个数学知识,一是逆元,二是等比数列求和公式。

一:逆元

我们知道 mod 这个东西在题目中时常出现,他可以用于加法,减法,乘法,然而,对于除法,它就不符合了,假定x是a的逆元值,那么b/a%c=b*x%c,就把除法转换成乘法,从而可以运用同余定理,防止计算中的数爆炸,是不是非常的没有用 ,嗯~~~~。

那么怎么求出a的逆元值呢,根据费马小定理,(有兴趣可以证明一下哈),因为小编也没怎么看懂,所以直入主题,简单来说就是b/a % c=b* a ( c − 2 ) a^{(c-2)} a(c2) %c。(前提c是素数)

二:等比数列求和公式

这个高中会学,也比较简单,在小编的范围之内,还是给大家推导一下吧。
假设有个a数列为等比公式,也就是满足ai-1*q=ai (q为公比)

S n = a 1 + a 2 . . . . . + a n Sn=a_1+a_2.....+a_n Sn=a1+a2.....+an
Sn * q-Sn=a1 *q+a2 * q…+an * q-a1-a2-a3…-an
Sn * q-Sn=a1 *q+a2 * q…+an * q-a1-a1 * q-a2 * q…-an-1 * q
Sn(q-1)=an * q-a1
Sn(q-1)=a(n+1)-a1
Sn(q-1)=a1 * q^n-a1
Sn=a1(q^n-1)/(q-1)
当然,也可以这样写:Sn=a1(1-q^n)/(1-q)

知识搞定了,那么我们就可以做题了。
大家先看看题目,就会发现S数列长度是k的倍数。
那么我们可以知道S=S1,S2,S3,…,Sk+(S1+…+Sn)。
那么每一个值用下面这个式子来求和
现在我们可以看出对于ai和ai+k来说,他们存在着一定关系
那么带入下面这个式子 Si*A^(n-i)*B ^i
自己推导一下q就为(b/a)^k

有这些那不就加上个疯狂mod不就大功造成了吗?
上代码:

#include<iostream>
#include<cstdio>
#include<cmath> 
#define N 100001
#define ll long long
using namespace std;
const ll mod=1e9+9;
ll pow1(ll x, ll y){while(x<0)x+=mod;ll ret=1;while(y){if(y&1)(ret*=x)%=mod;(x*=x)%=mod,y>>=1;}return ret;
}
ll n,a,b,k;
char f;
ll s,sum,a1,q,zs;
int main()
{scanf("%lld%lld%lld%lld\n",&n,&a,&b,&k);for(int i=0;i<k;i++){scanf("%1c",&f);if(f=='+') s=1;else s=mod-1;a1=((s%mod*pow1(a,n-i)%mod)%mod*pow1(b,i)%mod)%mod;q=pow1(b*pow1(a,mod-2)%mod,k)%mod;zs=(n+1)/k;if(q==1) sum=(sum+a1*zs%mod)%mod;else sum=(sum+a1*(pow1(q,zs)-1)%mod*pow1(q-1,mod-2)%mod)%mod;}printf("%lld",sum);return 0;	
} 

如有不足之处,请多谅解,小编尽力改进。

这篇关于CF963A Alternating Sum的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659036

相关文章

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

如何导入sun.misc.BASE64Encoder和sum.misc.BASE64Decoder

右击项目名--->Build Path--->Configure Build Path...--->java Build Path--->Access rules:1 rule defined,added to all librar...   --->Edit --->Add...

18. 4 Sum

题目: 解答: 与之前的三数之和的解法类似,也是先排序,然后不断剔除不可能的条件,最后两个参数,通过两头求和计算得出。 代码: class Solution {public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> result;int len = nums.size

apt-get update更新源时,出现“Hash Sum mismatch”问题

转载自:apt-get update更新源时,出现“Hash Sum mismatch”问题 当使用apt-get update更新源时,出现下面“Hash Sum mismatch”的报错,具体如下: root@localhost:~# apt-get update ...... ...... W: Failed to fetch http://us.archive.ubuntu.com/ub

[LeetCode] 303. Range Sum Query - Immutable

题:https://leetcode.com/problems/range-sum-query-immutable/description/ 题目 Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. Example: Given nums

[LeetCode] 64. Minimum Path Sum

题:https://leetcode.com/problems/minimum-path-sum/description/ 题目 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers

[LeetCode] 404. Sum of Left Leaves

题:https://leetcode.com/problems/sum-of-left-leaves/description/ 题目 Find the sum of all left leaves in a given binary tree. Example: 3/ \9 20/ \15 7There are two left leaves in the binary t

数论 --- 费马小定理 + 快速幂 HDU 4704 Sum

Sum  Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=4704   Mean:  给定一个大整数N,求1到N中每个数的因式分解个数的总和。   analyse: N可达10^100000,只能用数学方法来做。 首先想到的是找规律。通过枚举小数据来找规律,发现其实answer=pow(2,n-1);

LeetCode - 40. Combination Sum II

40. Combination Sum II  Problem's Link  ---------------------------------------------------------------------------- Mean:  给你一个待选集合s和一个数n,选出所有相加之和为n的组合.(每个元素只能选一次) analyse: 递归求解. 在递归进入

LeetCode - 39. Combination Sum

39. Combination Sum  Problem's Link  ---------------------------------------------------------------------------- Mean:  给你一个待选集合s和一个数n,让你找出集合s中相加之和为n的所有组合.(每个数可选多次) analyse: 作此题需对递归有一定的