以下代码是我对问题的解决方案: 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:
4555000 3
输出1:
2080638 2080638
输入2:
4555000 8
输出2:
907276560 529323732
编辑:-我已经解决了问题。未定义除法上的模数。幂函数返回幂模 K,其中 K=1000000007。让我们将这个新值称为缩减值。我正在划分两个减少的值。因此,最终答案也少于实际答案。现在我已经确定了他的问题,我仍然不知道如何克服这个问题。
Edit2:- 将第二部分更改为以下作品(在网上找到)。我不知道为什么。
answer=(power(power(2,l),k) - 1);
answer=(answer*power((power(2,l)-1),K-2))%K;
answer=(answer*m)%K;