题目链接:http://codeforces.com/problemset/problem/468/A
题意就不用说了吧,应该挺好理解的。
在说解题思路之前先说说本人之前 犯的一个错误吧:首先很容易想到如果n!*q>p,那么an=(n!*p)/q,然后p=p*n!-an*q,q=q*n!,依次循环,直到p==0。这个思路是没错的,只不过容易爆掉,因为p和q增长的太快了(约分也没用。。。),所以说必须简化。。
正确方法:p 每次乘以i,如果p*i>=q那么an=(p*i)%q,p=(p*i)%q,而q不改变(因为下一次执行的时候p只乘了i,默认了q之前乘了(n-1)!,简单的来说就是约掉了。。)。留下了没有技术的眼泪。。。
AC代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef long long ll;
int main()
{
ll i=1,a;
ll p,q;
cin>>p>>q;
cout<<p/q<<" ";
p=p%q;
for(i=2;p!=0;i++)
{
if(i*p>=q)
{
p=p*i;
a=p/q;
cout<<a<<" ";
p=p%q;
}
else
{
cout<<"0 ";
p=p*i;
}
}
return 0;
}