如果通过循环求和,下面的程序会找到正确的答案,但如果通过GP的公式求和,则会找到不正确的答案.为什么
The following program finds the correct answer if summation is done via loop but incorrect if done via formula for GP. Why?
以下代码是我对该问题的解决方案:http://codeforces.com/contest/327/problem/C
我通过循环执行求和的第一部分(因此时间复杂度较差)给出了正确的答案。
我使用几何级数公式的第二部分在许多测试用例中返回了错误的答案,尽管我认为使用的公式是正确的。
我做错了什么?(编辑:-发现问题。在最后解释)
#include<stdio.h>
#include<string>
#include<vector>
#include<iostream>
typedef long long int lli;
using namespace std;
lli power(lli base, lli exponent)
{
lli result=1;
while(exponent)
{
if(exponent & 1)
result=(result*base)%1000000007;
exponent>>=1;
base=(base*base)%1000000007;
}
return result%1000000007;
}
int main()
{
string n;
cin>>n;
lli k;
cin>>k;
vector<int> position;
for(int i=0;i<n.length();i++)
if(n[i]=='5' || n[i]=='0')
position.push_back(i);
lli m=0;
for(int i=0;i<position.size();i++)
m=(m+power(2,position[i]))%1000000007;
lli answer=0;
lli l=n.length();
// part1
// the following is finding summation via loop
for(int i=1;i<=k;i++)
answer=(answer + (power(2,l*(k-i))*m)%1000000007)%1000000007;
cout<<answer<<endl;
//part2
// the following finds the sum by using gp formula (1st_term*(ratio^no_of_terms-1)/(ratio-1))
answer=1;
answer=((power(power(2,l),k) - 1)/(power(2,l)-1))%1000000007;
answer*=m%1000000007;
cout<<answer<<endl;
return 0;
}
样本输入和输出耦合
输入1:
45550003
输出1:
20806382080638
输入2:
45550008
输出2:
907276560529323732
编辑:-我已经解决了问题。未定义除法上的模。幂函数返回幂模K,其中K=1000000007。让我们把这个新值称为减少值。我正在划分两个减少的值。因此,最终答案也比实际答案要少。既然我已经发现了他的问题,我仍然不知道如何克服这个问题。
第二版:-将第二部分改为以下作品(在线找到)。我不知道为什么。
answer=(power(power(2,l),k) - 1);
answer=(answer*power((power(2,l)-1),K-2))%K;
answer=(answer*m)%K;
有趣;谢谢你的问题和张贴修复。fyi,这是对你正在做的事情的解释:
你可能会看到,你已经用乘以x^(K-2)代替了除以x(即乘以1/x)。所以问题是:为什么是K-2?
答案基本上是费马的小定理,它说当你对素数K(100000007是素数)进行乘法运算时,x^(K-1)=1。如果你把它的两边除以x,那么你得到x^(K-2)=1/x。
我希望你能看到这是如何解释你的代码为什么工作的——一方面你有你的K-2,另一方面除以x,所以K-2的幂等于取倒数。
例如,考虑取模5(它是素数)并将9除以3。
9/3=3和3%5=3,这是我们想要的,但分割可能是一个问题:
(9%5)/3=4/3=?这意味着模5是什么?(这是你的错误)
所以让我们使用K-2技巧:9*(3^(5-2))=9*(3^3)=9*27=243和243%5=3
或者,(9%5)*(3^(5-2))=4*(3^3)=4*27=108和108%5=3
在long long int
表达式中,您需要确保您的文字常量也是long long int
(目前您使用int
作为文字常量)。因此,例如更改:
base=(base*base)%1000000007;
至:
base=(base*base)%1000000007LL;
更好的是,您不应该在代码中乱丢硬编码的常量,而是只定义一个常量并使用它,例如
const long long int K = 1000000007LL;
....
base=(base*base)%K;
模运算符%先于*=运算符
- 如果没有malloc,链表实现将失败
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 欧拉项目#8答案是大以获得有效答案
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 首要问题的答案让值班员搞错了
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- C++擦除(如果存在)
- NAN 使用 pow 评估指数时,但如果我迭代,答案正确?
- 如果遵循IEEE 754的两种语言,则两种语言的计算都会产生相同的答案
- 程序在第一次运行时正确地找到了最大值和最小值,但如果我再次运行,它会给我错误的答案
- 如果通过循环求和,下面的程序会找到正确的答案,但如果通过GP的公式求和,则会找到不正确的答案.为什么
- 如果边没有按权值排序插入队列,0-1 BFS是否会产生正确的答案?
- 如果此代码中的答案为"N",我该如何转到第一个 while 循环:
- 如果答案的绝对或相对误差小于10^(- 6),则视为正确
- 在我的C++代码中,如果我在循环外打印sum,它会给出正确的答案,但在任何循环中都不会,为什么不呢