Advertisement
yicongli

HDU6439

Mar 17th, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.84 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int p=1e9+7;
  17. const int N=1e6+7;
  18.  
  19. inline int add(int a,int b){
  20.     return (a+=b)>=p?a-p:a;
  21. }
  22.  
  23. inline int sub(int a,int b){
  24.     return (a-=b)<0?a+p:a;
  25. }
  26.  
  27. inline ll qpow(ll a,ll b){
  28.     ll ans=1;
  29.     while(b){
  30.         if(b&1)(ans*=a)%=p;
  31.         (a*=a)%=p;
  32.         b>>=1;
  33.     }
  34.     return ans;
  35. }
  36.  
  37. int gcd(int a,int b){
  38.     return b?gcd(b,a%b):a;
  39. }
  40.  
  41. int Arr[N];
  42. int f[N];
  43. int inv[55];
  44.  
  45. inline void pre(int x){
  46.     f[1]=1;
  47.     for(int i=1;i<=x+1;++i){
  48.         Arr[i]=qpow(i,x);
  49.     }
  50.     for(int i=1;i<=x+1;++i){
  51.         for(int j=1;j<=x-i+1;++j){
  52.             Arr[j]=sub(Arr[j+1],Arr[j]);
  53.         }
  54.         f[i+1]=Arr[1];
  55.     }
  56. }
  57.  
  58.  
  59. inline int S(int n,int x){
  60.     ll ret=0,C=1;
  61.     for(int i=0;i<=x+1;++i){
  62.         ret+=C*f[i]%p;
  63.         C=C*inv[i+1]%p*(n-i)%p;
  64.     }
  65.     return ret%p;
  66. }
  67.  
  68. int tot;
  69. int pri[N];
  70. bool mark[N];
  71. int mu[N];
  72. int Sum[N];
  73.  
  74. map<int,int>mp;
  75. inline int getsum(int n){
  76.     if(n<N)return Sum[n];
  77.     if(mp[n])return mp[n];
  78.     ll ans=1;
  79.     for(int i=2,j;i<=n;i=j+1){
  80.         j=n/(n/i);
  81.         ans-=(ll)(j-i+1)*getsum(n/i);
  82.     }
  83.     return mp[n]=ans;
  84. }
  85.  
  86. inline void init(int n=N-1){
  87.     mu[1]=1;
  88.     for(int i=2;i<=n;++i){
  89.         if(!mark[i])pri[++tot]=i,mu[i]=-1;
  90.         for(int j=1;j<=tot;++j){
  91.             int tmp=i*pri[j];
  92.             if(tmp>n)break;
  93.             mark[tmp]=1;
  94.             if(i%pri[j])mu[tmp]=-mu[i];
  95.             else {
  96.                 mu[tmp]=0;break;
  97.             }
  98.         }
  99.     }
  100.     for(int i=1;i<=n;++i){
  101.         Sum[i]=Sum[i-1]+mu[i];
  102.     }
  103.     inv[1]=1;
  104.     for(int i=2;i<=51;++i){
  105.         inv[i]=(ll)(p-p/i)*inv[p%i]%p;
  106.     }
  107. }
  108.  
  109. int cnt;
  110. ll ans;
  111.  
  112. vector<int>factor;
  113.  
  114. inline void dfs(int x,int y,int n){
  115.     if(x==factor.size()){
  116.         ans+=y*S(n,cnt);
  117.         return ;
  118.     }
  119.     dfs(x+1,-y,n/factor[x]);
  120.     dfs(x+1,y,n);
  121. }
  122.  
  123. int main(){
  124.     init();
  125.     int T;r(T);
  126.     for(int cas=1;cas<=T;++cas){
  127.         int n,k;r(k),r(n);
  128.         int g=0;
  129.         ans=cnt=0;
  130.         for(int i=1;i<=k;++i){
  131.             int x;r(x);
  132.             if(~x)g=gcd(g,x);
  133.             else ++cnt;
  134.         }
  135.         pre(cnt);
  136.         if(g){
  137.             factor.clear();
  138.             for(int i=1;i<=tot;++i){
  139.                 int t=pri[i];
  140.                 if(t*t>g)break;
  141.                 if(g%t==0){
  142.                     factor.push_back(t);
  143.                     while(g%t==0)g/=t;
  144.                 }
  145.             }
  146.             if(g>1)factor.push_back(g);
  147.             dfs(0,1,n);
  148.         }
  149.         else {
  150.             for(int i=1,j;i<=n;i=j+1){
  151.                 j=n/(n/i);
  152.                 ans+=(ll)(getsum(j)-getsum(i-1))*S(n/i,cnt)%p;
  153.             }
  154.         }
  155.         printf("Case #%d: %lld\n",cas,(ans%p+p)%p);
  156.     }
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement