D Fake News
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include <algorithm>
#include <numeric>
#include <vector>
#include <functional>
#include <list>
#include <ctype.h>
#include<map>
#include <set>
using namespace std;
typedef long long ll;
int main(){
ll t;
scanf("%lld", &t);
while (t--)
{
ll n;
scanf("%lld", &n);
if (n == 1 || n == 24)
printf("Fake news!\n");
else
printf("Nobody knows it better than me!\n");
}
}
H-Dividing
将题解和数论分块联系起来
数论分块
数论分块常用于解决求 X/i的和
我们了解 X/i ,最多只有2√N个不同的值。
我们只要求出来对应相同值的区间即可。
模板如下:
for(int l=1,r;l<=n;l=r+1){
r=n/(n/l);
ans+=(n/l)*(r-l+1);
}
//解题思路:数论分块;
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include <algorithm>
#include <numeric>
#include <vector>
#include <functional>
#include <list>
#include <ctype.h>
#include<map>
#include <set>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
int main(){
ll n,k;
scanf("%lld %lld",&n,&k);
ll cnt=n;
for(ll i=2,r;i<=k;i=r+1){
ll x=n/i;
if(x==0) break;
r=n/x;
cnt=(cnt + ((min(r, k)-i+1))% mod*(x%mod))%mod;
}
for(ll i=2,r;i<=k;i=r+1){
ll x=(n-1)/i;
if(x==0) break;
r=(n-1)/x;
cnt=(cnt + ((min(r, k)-i+1))% mod*(x%mod))%mod;
}
cnt=(cnt+k-1)%mod;
printf("%lld\n",cnt);
return 0;
}
与本题联系:通过题解可知 n为k的倍数或(n-1)为k的倍数,对于某一个k而言,1~N中是k倍数的数有 (N/k)个。
故可以用分块解决问题。
B-Mask Allocation
完全根据题解写没什么花里胡哨的,不过还是出现了一次段错误。
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include <algorithm>
#include <numeric>
#include <vector>
#include <functional>
#include <list>
#include <ctype.h>
#include<map>
#include <set>
using namespace std;
typedef long long ll;
const int N=10005;
//int a[N],k=0;
vector<int> a;
void solve(int n,int m){
if(n>m) swap(n,m);
if(n==0) return;
for(int i=1;i<=(m/n)*n;i++) a.push_back(n);
solve(n,m%n);
}
int main(){
int t;scanf("%d",&t);
while(t--){
int n,m;
scanf("%d %d",&n,&m);
// k=0;
// memset(a,0,sizeof(a));
a.clear();
solve(n,m);
printf("%d\n",a.size());
for(int i=0;i<a.size();i++) printf("%d ",a[i]);
printf("\n");
}
}
这里我开始用的是一个 a[10005] 数组存放结果,提交时出现了段错误,说是数组越界或递归层数过多,后来分析了一下,n,m的范围是1e4但是盒子的个数也就是数组大小应该是大于1e4的,所以将数组换成了vector容器,最后AC。