题意:已知n、m、x,n表示有一个序列从1到n,m表示m次操作,每次操作为将偶数位置上的数按顺序拿出来放在序列的前面,
x表示输出最终序列的前x个数
思路:找规律,每次操作都将x变为(x*2)%n,前提n为奇数,用快速幂求出第一位上的数,再依次求后面的
#include <stdio.h>
#include <math.h>
using namespace std;
long long int q(long long int x,long long int y,long long int n)//x^y
{
long long int t=1;
while(y)
{
if(y&1)
t=(t*x)%n;
x=(x*x)%n;
y>>=1;
}
return t;
}
int main()
{
long long int n,x;
long long int m;
while(~scanf("%lld%lld%lld",&n,&m,&x))
{
if(n%2==0)
n++;
long long int an=q(2,m,n);
//printf("%lld\n",an);
long long int ans=an;
printf("%lld",ans);
for(int i=2;i<=x;i++)
{
ans=(ans+an)%n;
printf(" %lld",ans);
}
putchar('\n');
}
return 0;
}