ARC064 F Rotated Palindromes(1000)

部分問題への分割

基本にのっとって問題の分割をすると、再帰的な問題だと気づく

まさか解法が降ってくるとは思わなかった

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<vector>
  4. #include<queue>
  5. #define lol(i,n) for(int i=0;i<n;i++)
  6. #define mod 1000000007
  7. typedef long long ll;
  8. using namespace std;
  9. ll Pmod(ll n,ll k){
  10. ll r=k,ret=1;
  11. while(true){
  12. if(n==0)break;
  13. if(n%2==1){
  14. ret=ret*r%mod;
  15. }
  16. n/=2;
  17. r=r*r%mod;
  18. }
  19. return ret;
  20. }
  21. vector<pair<ll,ll> > v;
  22. int main(){
  23. ll n,k;
  24. cin>>n>>k;
  25. for(ll i=1;i*i<=n;i++){
  26. if(n%i==0){
  27. v.push_back(make_pair(i,-1));
  28. if(i!=n/i)v.push_back(make_pair(n/i,-1));
  29. }
  30. }
  31. sort(v.begin(),v.end());
  32. ll ans[2]={0,0};
  33. for(int i=0;i<v.size();i++){
  34. ll x=v[i].first;
  35. ll tmp=Pmod((x+1)/2,k);
  36. for(int j=0;j<i;j++){
  37. if(x%v[j].first==0){
  38. tmp=(mod+tmp-v[j].second)%mod;
  39. }
  40. }
  41. v[i].second=tmp;
  42. ans[x%2]+=tmp*x%(mod*(ll)10);
  43. }
  44. //cout<<ans[0]<<" "<<ans[1]<<endl;
  45. cout<<(ans[0]/2+ans[1])%mod<<endl;
  46. return 0;
  47. }

後で割る時は、modで抑えるといけないのでmodを5倍くらいにしとく