A题
容斥定理
详细题解
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=100;
int k;
ll ans[maxn];
ll solve(ll a)
{
if(a==0) return 0;
ll num=a;
for(int i=1;i<(1<<k);i++)
{
int cnt=0;
ll mul=1;
bool isok=true;
for(int j=0;j<k;j++)
{
if(i&(1<<j))
{
cnt++;
if(a/mul<ans[j]){
isok=false;
break;
}
mul*=ans[j];
}
}
if(isok)
{
if(cnt%2)
num-=a/mul;
else
num+=a/mul;
}
}
return num;
}
int main(){
ll l,r;
scanf("%lld%lld%d",&l,&r,&k);
for(int i=0;i<k;i++)
scanf("%lld",&ans[i]);
printf("%lld\n",solve(r)-solve(l-1));
}
B题
C题
D题
判断5的个数就好;注意题目是阶乘的乘积,所以要把每个阶乘的5个数搞出来
#include<iostream>
#include<math.h>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
ll n;
cin>>n;
if(n<=4)
cout<<0;
else
{
ll sum=0;
ll cnt;
for(int i=5;i<=n;i+=5)
{
cnt=0;
ll z=i;
while(z%5==0)
{
cnt++;
z/=5;
}
sum+=(n-i+1)*cnt;
}
cout<<sum;
}
}
E题
F题
#include<iostream>
using namespace std;
typedef long long int ll;
int main()
{
ll n;
ll k;
while(cin>>n)
{
k=n*(n-1)*(n-2)*(n-3)/24+n*(n-1)/2+1;
cout<<k<<endl;
}
}
G题
#include<iostream>
using namespace std;
typedef long long int ll;
int main()
{
ll n;
while(cin>>n)
{
ll ans=(n/3)*2+n%3;
cout<<ans<<endl;
}
}
H题
签到题
#include<iostream>
#include<math.h>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef unsigned long long int ull;
int main()
{
ull a,b;
cin>>a>>b;
cout<<a/__gcd(a,b)*b<<endl;
}
I题
前缀和,差分的运用
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<math.h>
using namespace std;
typedef long long int ll;
const int maxn=1e6+5;
ll a[maxn];
ll d[maxn];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
d[i]=a[i]-a[i-1];
}
int q,l,r,p;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&q,&l,&r,&p);
if(q!=1)
{
d[l]+=p;
d[r+1]-=p;
}
else
{
d[l]-=p;
d[r+1]+=p;
}
}
for(int i=1;i<=n;i++)
{
d[i]+=d[i-1];
}
for(int i=1;i<=n;i++)
{
d[i]+=d[i-1];
}
int zl,zr;
cin>>zl>>zr;
cout<<d[zr]-d[zl-1];
}
J题
模拟题,用分的阶段去判断小时,如果小时的回文分钟大于60分钟,小时–或++任何重复操作就行
#include<iostream>
#include<cstdio>
#include<math.h>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
int a,b;
char s;
while(cin>>a>>s>>b)
{
if(a==6||a==7||a==8||a==9)
{
cout<<"5:50"<<endl;
cout<<"10:1"<<endl;
}
else if(a==16||a==17||a==18||a==19)
{
cout<<"15:51"<<endl;
cout<<"20:2"<<endl;
}
else if(a==0)
{
if(b==0)
{
cout<<"23:32"<<endl;
}
else
{
cout<<"0:0"<<endl;
}
cout<<"1:10"<<endl;
}
else if(a==23)
{
if(b<32)
{
cout<<"22:22"<<endl;
cout<<"23:32"<<endl;
}
else if(b==32)
{
cout<<"22:22"<<endl;
cout<<"0:0"<<endl;
}
else
{
cout<<"23:32"<<endl;
cout<<"0:0"<<endl;
}
}
else
{
int c,d;
c=a;
d=c%10*10+c/10;//取回文数
if(d<b)
{
printf("%d:%d\n",c,d);
}
else
{
c--;
d=c%10*10+c/10;
while(d>=60)
{
c--;
d=c%10*10+c/10;
}
printf("%d:%d\n",c,d);
}
c=a;
d=c%10*10+c/10;
if(d>b&&d<60)
printf("%d:%d",c,d);
else
{
c++;
d=c%10*10+c/10;
while(d>=60)
{
c++;
d=c%10*10+c/10;
}
printf("%d:%d",c,d);
}
}
}
}