作者:Victoria625_176 | 来源:互联网 | 2023-10-10 19:18
篇首语:本文由编程笔记#小编为大家整理,主要介绍了牛客白月赛5 题解 数学场相关的知识,希望对你有一定的参考价值。
数学场
https://ac.nowcoder.com/acm/contest/135#question
目录
- 无关(relationship)【容斥】
- 范围(range)【不会】
- 水题(water)【不会】
- 阶乘(factorial)【思维 末尾0的个数】
- 面积(area)【不会】
- 圆(circle)【n个点将圆分成几部分】
- 异或(xor)
- 最大公约数(lcm)
- 区间 (interval)【差分】
- 时间(time)【模拟】
无关(relationship)【容斥】
#include
using namespace std;
typedef long long int LL;
const int N=25;
LL l,r,n,a[N];
LL solve(LL x)
LL sum=0;
for(int i&#61;1;i<(1<<n);i&#43;&#43;)
LL temp&#61;x,cnt&#61;-1;
for(int j&#61;0;j<n;j&#43;&#43;)
if((i>>j)&1&#61;&#61;1) temp/&#61;a[j],cnt&#61;cnt*(-1);
sum&#61;sum&#43;cnt*temp;
return x-sum;
int main(void)
cin>>l>>r>>n;
for(int i&#61;0;i<n;i&#43;&#43;) cin>>a[i];
cout<<solve(r)-solve(l-1);
return 0;
范围(range)【不会】
水题(water)【不会】
阶乘(factorial)【思维 末尾0的个数】
2*5&#61;&#61;10 2的个数一定大于5的个数。故就是求5的个数。
#include
using namespace std;
typedef long long int LL;
LL sum,n,cnt;
int main(void)
cin>>n;
for(int i&#61;1;i<&#61;n;i&#43;&#43;)
int j&#61;i;
while(j%5&#61;&#61;0) cnt&#43;&#43;,j/&#61;5;
sum&#43;&#61;cnt;
cout<<sum;
return 0;
面积(area)【不会】
圆(circle)【n个点将圆分成几部分】
#include
using namespace std;
typedef long long int LL;
int main(void)
LL n;
while(cin>>n)
LL sum&#61;0;
if(n>&#61;4) sum&#43;&#61;n*(n-1)*(n-2)*(n-3)/4/3/2;
if(n>&#61;2) sum&#43;&#61;n*(n-1)/2;
sum&#43;&#43;;
cout<<sum<<endl;
return 0;
异或(xor)
#include
using namespace std;
typedef long long int LL;
LL n;
int main(void)
while(scanf("%lld",&n)!&#61;-1) printf("%lld\\n",n/3*2&#43;n%3);
return 0;
最大公约数(lcm)
#include
using namespace std;
typedef long long int LL;
LL gcd(LL a,LL b)return b?gcd(b,a%b):a;
int main(void)
LL a,b; cin>>a>>b;
cout<<a/gcd(a,b)*b;
return 0;
区间 (interval)【差分】
#include
using namespace std;
const int N&#61;1e6*3&#43;10;
typedef long long int LL;
LL n,m,x,a[N];
void add(int l,int r,int x)
a[l]&#43;&#61;x;
a[r&#43;1]-&#61;x;
int main(void)
cin>>n>>m;
for(int i&#61;1;i<&#61;n;i&#43;&#43;) cin>>x,add(i,i,x);
while(m--)
LL op,l,r,p; cin>>op>>l>>r>>p;
if(op!&#61;1) add(l,r,p);
else add(l,r,-p);
for(int i&#61;1;i<&#61;n;i&#43;&#43;) a[i]&#43;&#61;a[i-1];
LL sum&#61;0,l,r;
cin>>l>>r;
for(int i&#61;l;i<&#61;r;i&#43;&#43;) sum&#43;&#61;a[i];
cout<<sum<<endl;
return 0;
时间(time)【模拟】
#include
using namespace std;
bool check(int x,int y)
int a1&#61;x/10,a2&#61;x%10;
int b2&#61;y/10,b1&#61;y%10;
if(a1&#61;&#61;b1&&a2&#61;&#61;b2) return true;
return false;
int main(void)
string s; cin>>s;
int a,b;
a&#61;stoi(s.substr(0,s.find(&#39;:&#39;)));
b&#61;stoi(s.substr(s.find(&#39;:&#39;)&#43;1));
int x&#61;0,y&#61;0;
for(int i&#61;0,j&#61;0;;j&#43;&#43;)
if(j&#61;&#61;60) j&#61;0,i&#43;&#43;;
if(i&#61;&#61;a&&j&#61;&#61;b) break;
if(check(i,j)) x&#61;i,y&#61;j;
printf("%d:%d\\n",x,y);
x&#61;0,y&#61;0;
for(int i&#61;a,j&#61;b&#43;1;;j&#43;&#43;)
if(j&#61;&#61;60) j&#61;0,i&#43;&#43;;
if(i&#61;&#61;24) break;
if(check(i,j))
x&#61;i,y&#61;j;
break;
printf("%d:%d\\n",x,y);
return 0;