问题标题: 酷町堂:3866 转圈游戏

0
0
已解决
杨子逸
杨子逸
新手天翼
新手天翼

求各位大佬告知(0分代码):

#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstdio>
using namespace std;
long long n,m,k,x;
long long s(long long g,long long k)
{
    if(k==0) return 0;
    if(k==1) return g ;
    if(k%2==0) return s(g*g,k/2);
    return (s(g*g,k/2)*g);
}
int main()
{
    cin>>n>>m>>k>>x;
    for(int i=1;i<=s(10,k);i++)
    {
        x=(x+m)%n;
        cout<<x<<endl;
    }
    cout<<x;
    return 0;
}


0
已采纳
张元宝
张元宝
修练者
修练者
long long s(long long g,long long k)
{
    if(k==0) return 1; 
    if(k==1) return g;
    if(k%2==0) return (s((g*g)%n,k/2))%n;
    return (s(g*g%n,k/2)*g%n)%n;
}
0
余牧
余牧
修练者
修练者

#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstdio>
using namespace std;
long long n,m,k,x;
long long s(long long g,long long k)
{
    if(k==0) return 0;//任何数的0次方都等于1 
    if(k==1) return g ;
    if(k%2==0) return s(g*g,k/2);
    return (s(g*g,k/2)*g);
}//由于结果远大于long long范围,因此每一次运算都要%n 
int main()
{
    cin>>n>>m>>k>>x;
    for(int i=1;i<=s(10,k);i++)
    {
        x=(x+m)%n;
        cout<<x<<endl;//这一行大概是你测试用的吧 删掉 
    }
    cout<<x;//直接输出结果((s(10,k)*(m%n)%n)+(x%n))%n)即可 
    return 0;
}

0
王欣怡
王欣怡
新手光能
新手光能
递归函数:
long long s=1;
while(n)
{
    if(n&1)
    s=(s*a)%p;
    a=(a*a)%p;
    n=n>>1;
}
return s;
=========================分割线
主函数:
cin>>n>>m>>k>>x;
cout<<(x+(m*fast(10,k,n)%n)%n)%n;
return 0;

求采纳

 

新年快乐,同学!!

0
0
0
桑烁
桑烁
高级光能
高级光能

1.递归(快速幂)return每次运算%n(防止超long long)

2.主函数,循环次数 qs(10, k)次//我的函数是qs,你的可能不一样

                x=(x+m)%n;//+m:每次转圈加的,%n:保证在总个数以内

我要回答