比赛链接
solution:solution
1.gym/101810-N-Dimensional Grid【找规律】
首先得看懂题意,题目中输入的是维度个数和每个维度的空间大小。
看 2 3这组样例 答案是7
然后把点分成
1 1 ——— 2 1
1 2 ——— 2 2
1 3 ——— 2 3
这两部分 ,从第一个维度的一种,转移到第二个维度
参考博客
则有公式
其中ans【i】表示第i个维度答案,num表示没加当前维度之前所拥有的格子总数,a【i】表示第i个维度的空间大小。
code:
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
long long a[120323];
const long long mod = 1e9+7;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
long long ans =0 ;
long long num = 1;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
ans =( ans*a[i])%mod;
ans = (ans+num*(a[i]-1)%mod)%mod;
num = (num*a[i])%mod;
}
cout<<ans<<endl;
}
return 0;
}
2
C. Flip the Bits
题意,求把n翻转成小于n的最大的数所需最小的步数。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int main(int argc, char* argv[]) {
int t;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
printf("%d\n", __builtin_popcount(n ^ (n - 1)));
}
return 0;
}
D. Magic Sticks
还是得先看看懂题意:
用n*m格子中的边来完全覆盖整个图,求最小边数。
完全覆盖是指每个格子的四条边至少有一条需要覆盖。
当某一行格子的边数为奇数的时候,类似于图中那个填法就行了
当某一行格子的边数为偶数的时候,直接除以2就行了
这里注意一下(n/2+1)和(n+1)/2的区别就行了
code:
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n,m;
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
if(n>m)
swap(n,m);
long long tmp = m/2+1;
long long ans =0 ;
ans=ans+tmp*(n/2)+((n+1)/2)*(m+1-tmp);
cout<<ans<<endl;
}
return 0;
}