acm专题四
一、第一题
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long mod=19260817,na=0,nb=0,res=1,k=mod-2;
string a,b;
cin>>a>>b;
for(long long i=0;i<a.length();i++) na=(na*10+a[i]-'0')%mod;
for(long long i=0;i<b.length();i++) nb=(nb*10+b[i]-'0')%mod;
while(k)
{
if(k%2!=0) res=res*nb%mod;
nb=nb*nb%mod;k/=2;
}
cout<<na*res%mod;
return 0;
}
思路:用字符存,再取模转换为数字,然后求逆元
二、第二题
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,i,l,r;
cin>>t;
for(i=0;i<t;i++)
{
cin>>l>>r;
if(l==1&&r==1) cout<<1<<endl;
else cout<<r-l<<endl;
}
return 0;
}
思路:差值为1,一定互质
三、第三题
代码:
#include <bits/stdc++.h>
using namespace std;
int countPrimesInRange(long long L, long long R) {
int limit = sqrt(R);
vector<bool> isPrime(limit + 1, true);
vector<int> primes;
for (int i = 2; i <= limit; ++i) {
if (isPrime[i]) {
primes.push_back(i);
for (int j = i * i; j <= limit; j += i) {
isPrime[j] = false;
}
}
}
vector<bool> isComposite(R - L + 1, false);
for (int prime : primes) {
long long start = max((L + prime - 1) / prime * prime, (long long)prime * prime);
for (long long j = start; j <= R; j += prime) {
isComposite[j - L] = true;
}
}
int count = 0;
for (int i = 0; i <= R - L; ++i) {
if (!isComposite[i] && L + i > 1) {
++count;
}
}
return count;
}
int main() {
long long L, R;
cin >> L >> R;
cout << countPrimesInRange(L, R) << endl;
return 0;
}
思路:埃式筛素数
四、第四题
代码:
#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int main()
{
int x,y;
cin>>x>>y;
if(y%x!=0) cout<<0;
else
{
int p=y/x,ans=0,i;
for(i=1;i*i<=p;i++)
{
if(p%i==0)
{
int k1=i,k2=p/i;
if(gcd(k1,k2)==1)
{
ans++;
if(k1!=k2) ans++;
}
}
}
cout<<ans;
}
return 0;
}
思路:gcd(p,q)=x,lcm(p,q)-y,p=k1x,q=k2x,k1*k2=y/x,p=y/x,gcd(k1,k2)=1
总结:好难好难好难,我要受不了了