思维题

题目分析:x|y表示x整除y,也就是说x是y的因子,题目大意就是给你n个杯子,m个数(每个数都是无限多个的)你要填充满全部的杯子,因为1是任何比它大的数的因子,那么我们把第一个位置放1,后序所有素数的位置放2,因为题目说了保证下标如果y是x的因子,那么第x个杯子所放的数字一定大于第y个杯子的数,我们可以打表来看

位置:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
数字:1,2,2,3,2,3,2,4,3, 3, 2, 4, 2, 3, 3, 5

这样就一目了然了,观察1,2,4,8,16我们可以发现规律,发现每到下标为2的幂的位置,所需要的最大数都会加1,我们用二进制的思想来看,可以发现最大数其实就是二进制的位数。

AC代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <set>
#include <map>
#include <math.h>
#include <vector>
#include <queue>
#include <string.h>
typedef long long ll;
using namespace std;
#define pi acos(-1.0)
const int maxn = 1e5 + 10;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
int solve(int x)
{
    int ans = 0;
    while (x)
    {
        x >>= 1;
        ans++;
    }
    return ans;
}
int main()
{
    int t, ans = 0;
    scanf("%d", &t);
    for (int i = 1; i <= t; ++i)
    {
        int n, m;
        scanf("%d%d", &n, &m);
        if (m >= solve(n))
            ans ^= i;
        else
            ans ^= i - 1;
    }
    printf("%d\n", ans);
}