#include<bits/stdc++.h>#define int long longusingnamespacestd;constintN=1e7+5;intprime[N],phi[N],cnt;boolvis[N];intfac[N];intx,y;intexgcd(inta,intb,int&x,int&y){if(!b){x=1;y=0;returna;}intres=exgcd(b,a%b,x,y);inttmp=x;x=y;y=tmp-(a/b)*y;returnres;}voidinit(intn,intmod){phi[1]=1;fac[0]=fac[1]=1;for(inti=2;i<=n;i++){fac[i]=fac[i-1]*i%mod;if(!vis[i])prime[++cnt]=i,phi[i]=phi[i-1]*(i-1)%mod;elsephi[i]=phi[i-1]*i%mod;for(intj=1;prime[j]*i<=n;j++){vis[i*prime[j]]=true;if(i%prime[j]==0)break;}}}intqpow(inta,intn,intmod){intres=1;while(n){if(n&1)res=res*a%mod;a=a*a%mod;n>>=1;}returnres;}signedmain(){intt,mod;cin>>t>>mod;init(N-4,mod);while(t--){intn,m;cin>>n>>m;if(m%mod)cout<<fac[n]*phi[m]%mod*qpow(fac[m],mod-2,mod)%mod<<endl;else{inttmp=1;for(inti=m+1;i<=n;i++)(tmp*=i)%=mod;cout<<tmp*phi[m]%mod<<endl;}}return0;}
#include<bits/stdc++.h>#define int long longusingnamespacestd;constintN=1e7+5;intprime[N];boolvis[N];voideuler(){vis[1]=true;intcnt=0;for(inti=2;i<=N-5;i++){if(!vis[i])prime[++cnt]=i;for(intj=1;i*prime[j]<=N-5;j++){vis[i*prime[j]]=true;if(i%prime[j]==0)break;}}}signedmain(){intt;cin>>t;euler();while(t--){inta,b,k;scanf("%lld %lld %lld",&a,&b,&k);inttmpa=a,tmpb=b;intcnt1=0,cnt2=0;if(a>N-5||vis[a])for(registerintj=1;prime[j]*prime[j]<=a;j++){if(a%prime[j]==0){while(a%prime[j]==0){a/=prime[j];cnt1++;}}}if(a>1)cnt1++;if(b>N-5||vis[b])for(registerintj=1;prime[j]*prime[j]<=b;j++){if(b%prime[j]==0){while(b%prime[j]==0){b/=prime[j];cnt2++;}}}if(b>1)cnt2++;if(cnt1+cnt2<k)printf("No\n");elseif(k==1){if((tmpa%tmpb==0||tmpb%tmpa==0)&&tmpa!=tmpb)printf("Yes\n");elseif(tmpa==tmpb)printf("No\n");elseprintf("No\n");}elseprintf("Yes\n");}return0;}
#include<bits/stdc++.h>#define int long longconstintmod=1e9+7;usingnamespacestd;intgcd(inta,intb){returnb==0?a:gcd(b,a%b);}intlcm(inta,intb){returna/gcd(a,b)*b;}voidsolve(){intt,n;cin>>t;while(t--){cin>>n;intlcmm=1;inttmp=2;intres=0;while(lcmm<=n){intk1=n/lcmm;lcmm=lcm(lcmm,tmp);tmp++;intk2=n/lcmm;res+=(k1-k2)*(tmp-1);res%=mod;}cout<<res<<endl;}}signedmain(){solve();return0;}
我们知道,在\(1-n\)中,若\(a<n\),则\(a\)的倍数有\(n/a\)个,因此一种暴力的做法便是枚举约数\(1-y\)在\(x-y\)的倍数,复杂度\(O(y)\),超时,于是我们得想新方法。我们注意到我们需要知道的只是以\(1-y\)为约数的数有多少个,而大部分数的个数相同,如\(1-100\)内以\(51,52,53……100\)为约数的个数都只有一个,于是我们想到整除分块。易得答案为\(∑_1^y( y / i - x-1 / i ) * i\)。
代码
1 2 3 4 5 6 7 8 910111213141516171819202122232425
#include<bits/stdc++.h>#define int long longusingnamespacestd;intx,y;signedmain(){cin>>x>>y;intres=0;for(intl=1,r;l<=y;l=r+1){if(y/l)r=y/(y/l);elsebreak;res+=(y/l)*(r-l+1)*(l+r)/2;}for(intl=1,r;l<=y;l=r+1){if((x-1)/l)r=(x-1)/((x-1)/l);elsebreak;res-=(x-1)/l*(r-l+1)*(l+r)/2;}cout<<res<<endl;return0;}