下面的代碼是我的問題的解決方案:http://codeforces.com/contest/327/problem/C以下程序如果通過循環進行求和,則會找到正確的答案,但如果通過GP進行公式,則不正確。爲什麼?
,我通過循環進行求和(因此有一個糟糕的時間複雜度)第一部分給出了正確的答案。
即使我認爲使用的公式是正確的,我使用幾何級數公式的第二部分也會返回很多測試用例的不正確答案。
我在做什麼錯? (編輯: - 問題識別解釋末。)輸出
#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:
輸出1:
輸入2:
輸出2:
編輯: - 我已經找到了問題。模塊劃分沒有定義。功率函數返回模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;
感謝您的詳細解釋。 :) – Paagalpan