Advertisement
Guest User

Untitled

a guest
Oct 16th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. #define pii pair<int,int>
  5. #define pll pair<ll,ll>
  6. #define pdd pair<double,double>
  7. #define X first
  8. #define Y second
  9. #define REP(i,a) for(int i=0;i<a;++i)
  10. #define REPP(i,a,b) for(int i=a;i<b;++i)
  11. #define FILL(a,x) memset(a,x,sizeof(a))
  12. #define foreach( gg,itit )  for( typeof(gg.begin()) itit=gg.begin();itit!=gg.end();itit++ )
  13. #define mp make_pair
  14. #define pb push_back
  15. #define sz(a) int((a).size())
  16. #define debug(ccc)  cout << #ccc << " = " << ccc << endl;
  17. #define present(c,x) ((c).find(x) != (c).end())
  18. #define EQ(a,b) (fabs((a)-(b))<eps)
  19. inline int max(int a,int b){return a<b?b:a;}
  20. inline int min(int a,int b){return a>b?b:a;}
  21. inline ll max(ll a,ll b){return a<b?b:a;}
  22. inline ll min(ll a,ll b){return a>b?b:a;}
  23. const int mod = 1e9+7;
  24. const int N = 1e3+1;
  25. const ll INF = 1e18;
  26.  
  27. vector<int> G[N];
  28. int dp[N][N],pos[N][N];
  29. ll a[N],b[N],temp[N];
  30. void mul(ll a[],ll b[],int x){
  31.   int m=G[x].size();
  32.   REP(i,m) temp[i]=0;
  33.   int z;
  34.   REP(i,m) REP(j,m) {
  35.     z=pos[x][dp[x][(G[x][i]*G[x][j])%x]];
  36.     temp[z]=(temp[z]+a[i]*b[j]%mod)%mod;
  37.   }
  38.   REP(i,m) a[i]=temp[i];
  39. }
  40. ll power(int x,int n,int t){
  41.   int m=G[x].size();
  42.   REP(i,m) b[i]=0;
  43.   b[0]=1;
  44.   REP(i,m) a[i]=0;
  45.   REPP(i,1,t+1) a[pos[x][dp[x][i]]]++;
  46.   while(n>0){
  47.     if(n%2) n-=1,mul(b,a,x);
  48.     else n/=2,mul(a,a,x);
  49.   }
  50.   return b[m-1];
  51. }
  52. int main(){
  53.   int n,m;
  54.   scanf("%d %d",&n,&m);
  55.   REPP(i,1,m+1) REP(j,m+1) { dp[i][j]=__gcd(i,j); if(j!=0&&i%j==0) {pos[i][j]=G[i].size();G[i].pb(j);}}
  56.  
  57.   ll ans=0;
  58.   REPP(i,1,m+1){
  59.     ans+=power(i,n,m);
  60.   }
  61.   int x=0;
  62.   REP(i,N) {
  63.     int z=G[i].size();
  64.   //  if(i<10) printf("%d\n",(int)G[i].size());
  65.     if(z>x) x=z;
  66.   }
  67. //  printf("%d\n",x);
  68.   printf("%lld\n",ans%mod);
  69.   return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement