首页 > 代码库 > five
five
7月11日
A.
set|set.in|set.out
题目描述:
维护一个可重集,支持:
插入一个正整数
询问一个正整数k,集合中有多少个数是k的倍数
输入格式:
第一行一个整数N,表示操作数量。
接下来N行,每行两个整数a,b
如果a=1,表示向集合插入一个数b
如果a=2,询问有多少个数是b的倍数
输出格式:
输出一行一个整数,表示所有询问的答案的亦或和(不要想多,只是防cena智障)
样例输入:
5
1 2
1 3
2 2
1 6
2 3
样例输出:
3
数据范围:
共40组数据
对于第i组数据,n==1000*i,所有的b<=n
每组数据时限0.5秒
#include<cstdio>
#include<iostream>
#include<cstring>
#define PROC "set"
#define LL long long
using namespace std;
const int MAXN = 40 * 1000+5;
LL ans,now[MAXN]; int n;
void deal(int x)
{
int i;
for (i = 1;i*i<x;i++)
{
if (x % i ==0)
{
now[i]++;now[x/i]++;
}
}
if (i*i==x) now[i]++; return;
}
int main()
{
scanf("%d",&n);
int a,b;
for (int i = 1;i<=n;i++)
{
scanf("%d%d",&a,&b);
if (a==1)
deal(b);
else ans^=now[b];
}
cout<<ans;
return 0;
}
1.正解:即做。
做:普通思路显然超时,故转换思维,公约数以计,5分钟AC。
改:难得不用改。
得:简单复杂度计算方式 如此题:n * n^0.5
B.未完待续
C.loop|loop.in|loop.out
题目描述:
有N个点。
现在重复这样的操作:
随机找一个出度为0的点p1,随机找一个入度为0的点p2,连一条有向边从p1指向p2。直到没有出度为0的点。
统计最终状态这个图中的环的期望个数。
为了保证答案精度,提供另外一个参数W(正整数),请你输出小于你的答案乘上W后的最大整数。
输入格式:
一行两个整数N,W。
输出格式:
一行一个整数(保证不超过10^6)。
样例输入(多组,测试数据中只有一组):
1 100
2 100
样例输出:
99
149
数据范围:
30% N<=100
70% N<=5*10^6
100% N<=10^18
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define PROC "loop"
using namespace std;
const double eps = 0.00000001;
long long n,w;
double ans = 0.0;
int main()
{
cin>>n>>w;
if (n<5000000)
{
for (int i = 1;i<=n;i++)
ans +=1.0/(double) i;
}
else ans = log(n) + 0.57721566490;
cout<<(int)floor(ans * w - eps);
return 0;
}
3.正解:数学期望得公式(1/1+1/2+……+1/n),以欧拉函数优化n->正无穷值
即 ans = ln n + 欧拉常数(推导过程未知)
求欧拉常数技巧,暴力至极大值,减去ln n即可。
做:已推出公式,由于数学期望认识有误,故舍去,以自法求得n=3 answer,找规律解之。
改:double转化i + eps取 floor
得:变量类型毁一生