Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- #define pii pair<int,int>
- #define pll pair<ll,ll>
- #define pdd pair<double,double>
- #define X first
- #define Y second
- #define REP(i,a) for(int i=0;i<a;++i)
- #define REPP(i,a,b) for(int i=a;i<b;++i)
- #define FILL(a,x) memset(a,x,sizeof(a))
- #define foreach( gg,itit ) for( typeof(gg.begin()) itit=gg.begin();itit!=gg.end();itit++ )
- #define mp make_pair
- #define pb push_back
- #define sz(a) int((a).size())
- #define debug(ccc) cout << #ccc << " = " << ccc << endl;
- #define present(c,x) ((c).find(x) != (c).end())
- #define EQ(a,b) (fabs((a)-(b))<eps)
- inline int max(int a,int b){return a<b?b:a;}
- inline int min(int a,int b){return a>b?b:a;}
- inline ll max(ll a,ll b){return a<b?b:a;}
- inline ll min(ll a,ll b){return a>b?b:a;}
- const int mod = 1e9+7;
- const int N = 1e3+1;
- const ll INF = 1e18;
- vector<int> G[N];
- int dp[N][N],pos[N][N];
- ll a[N],b[N],temp[N];
- void mul(ll a[],ll b[],int x){
- int m=G[x].size();
- REP(i,m) temp[i]=0;
- int z;
- REP(i,m) REP(j,m) {
- z=pos[x][dp[x][(G[x][i]*G[x][j])%x]];
- temp[z]=(temp[z]+a[i]*b[j]%mod)%mod;
- }
- REP(i,m) a[i]=temp[i];
- }
- ll power(int x,int n,int t){
- int m=G[x].size();
- REP(i,m) b[i]=0;
- b[0]=1;
- REP(i,m) a[i]=0;
- REPP(i,1,t+1) a[pos[x][dp[x][i]]]++;
- while(n>0){
- if(n%2) n-=1,mul(b,a,x);
- else n/=2,mul(a,a,x);
- }
- return b[m-1];
- }
- int main(){
- int n,m;
- scanf("%d %d",&n,&m);
- 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);}}
- ll ans=0;
- REPP(i,1,m+1){
- ans+=power(i,n,m);
- }
- int x=0;
- REP(i,N) {
- int z=G[i].size();
- // if(i<10) printf("%d\n",(int)G[i].size());
- if(z>x) x=z;
- }
- // printf("%d\n",x);
- printf("%lld\n",ans%mod);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement