标签:codeforces 数论
题目大意:有一种卡片,正面和背面各写着一个整数,可以用一个有序数对
有三种操作:
1.出示一张卡片
2.出示一张卡片
3.出示两张卡片
一个人想要卡片
首先我们发现:
第一个操作不改变
第二个操作可以使
第三个操作可以使
那么我们不妨猜想:一张卡片
事实上这个是正确的
结论:卡片
证明:
必要性:
不妨设
故如果
必要性得证
充分性:
不妨设
我们任选一个
那么首先我们利用
然后我们利用操作1得到
然后进行
至此我们已经得到了
证毕
然后就好办了,我们枚举
时间复杂度
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 2020
using namespace std;
int n,m,gcd;
long long ans;
int divisor[M],tot;
void Get_Divisor(int n)
{
int i;
for(i=1;i*i<n;i++)
if(n%i==0)
{
divisor[++tot]=i;
divisor[++tot]=n/i;
}
if(i*i==n)
divisor[++tot]=i;
}
int main()
{
int i,j,x;
cin>>n>>m;
for(i=1;i<=n;i++)
{
scanf("%d",&x);
gcd=__gcd(gcd,x-1);
}
Get_Divisor(gcd);
for(i=1;i<=tot;i++)
if(divisor[i]&1)
for(j=divisor[i];j<=m;j<<=1)
ans+=m-j;
cout<<ans<<endl;
return 0;
}
codeforces #271E Three Horses 数论
标签:codeforces 数论
原文地址:http://blog.csdn.net/popoqqq/article/details/45825273